Blame src/tags_int.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
/*
Packit 01d647
 * Copyright (C) 2004-2018 Exiv2 authors
Packit 01d647
 * This program is part of the Exiv2 distribution.
Packit 01d647
 *
Packit 01d647
 * This program is free software; you can redistribute it and/or
Packit 01d647
 * modify it under the terms of the GNU General Public License
Packit 01d647
 * as published by the Free Software Foundation; either version 2
Packit 01d647
 * of the License, or (at your option) any later version.
Packit 01d647
 *
Packit 01d647
 * This program is distributed in the hope that it will be useful,
Packit 01d647
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 01d647
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 01d647
 * GNU General Public License for more details.
Packit 01d647
 *
Packit 01d647
 * You should have received a copy of the GNU General Public License
Packit 01d647
 * along with this program; if not, write to the Free Software
Packit 01d647
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit 01d647
 */
Packit 01d647
// *****************************************************************************
Packit 01d647
Packit 01d647
// included header files
Packit 01d647
#include "tags_int.hpp"
Packit 01d647
Packit 01d647
#include "convert.hpp"
Packit 01d647
#include "error.hpp"
Packit 01d647
#include "i18n.h"                // NLS support.
Packit 01d647
Packit 01d647
#include "canonmn_int.hpp"
Packit 01d647
#include "casiomn_int.hpp"
Packit 01d647
#include "fujimn_int.hpp"
Packit 01d647
#include "minoltamn_int.hpp"
Packit 01d647
#include "nikonmn_int.hpp"
Packit 01d647
#include "olympusmn_int.hpp"
Packit 01d647
#include "panasonicmn_int.hpp"
Packit 01d647
#include "pentaxmn_int.hpp"
Packit 01d647
#include "samsungmn_int.hpp"
Packit 01d647
#include "sigmamn_int.hpp"
Packit 01d647
#include "sonymn_int.hpp"
Packit 01d647
Packit 01d647
#include <cmath>
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// local declarations
Packit 01d647
namespace {
Packit 01d647
    // Print version string from an intermediate string
Packit 01d647
    std::ostream& printVersion(std::ostream& os, const std::string& str)
Packit 01d647
    {
Packit 01d647
        if (str.size() != 4) {
Packit 01d647
            return os << "(" << str << ")";
Packit 01d647
        }
Packit 01d647
        if (str[0] != '0') os << str[0];
Packit 01d647
        return os << str[1] << "." << str[2] << str[3];
Packit 01d647
    }
Packit 01d647
}
Packit 01d647
Packit 01d647
namespace Exiv2 {
Packit 01d647
    namespace Internal {
Packit 01d647
Packit 01d647
    //! List of all known Exif groups. Important: Group name (3rd column) must be unique!
Packit 01d647
    extern const GroupInfo groupInfo[] = {
Packit 01d647
        { ifdIdNotSet,     "Unknown IFD", "Unknown", 0 },
Packit 01d647
        { ifd0Id,          "IFD0",      "Image",        ifdTagList                     },
Packit 01d647
        { ifd1Id,          "IFD1",      "Thumbnail",    ifdTagList                     },
Packit 01d647
        { ifd2Id,          "IFD2",      "Image2",       ifdTagList                     },
Packit 01d647
        { ifd3Id,          "IFD3",      "Image3",       ifdTagList                     },
Packit 01d647
        { exifId,          "Exif",      "Photo",        exifTagList                    },
Packit 01d647
        { gpsId,           "GPSInfo",   "GPSInfo",      gpsTagList                     },
Packit 01d647
        { iopId,           "Iop",       "Iop",          iopTagList                     },
Packit 01d647
        { mpfId,           "MPF",       "MpfInfo",      mpfTagList                     },
Packit 01d647
        { subImage1Id,     "SubImage1", "SubImage1",    ifdTagList                     },
Packit 01d647
        { subImage2Id,     "SubImage2", "SubImage2",    ifdTagList                     },
Packit 01d647
        { subImage3Id,     "SubImage3", "SubImage3",    ifdTagList                     },
Packit 01d647
        { subImage4Id,     "SubImage4", "SubImage4",    ifdTagList                     },
Packit 01d647
        { subImage5Id,     "SubImage5", "SubImage5",    ifdTagList                     },
Packit 01d647
        { subImage6Id,     "SubImage6", "SubImage6",    ifdTagList                     },
Packit 01d647
        { subImage7Id,     "SubImage7", "SubImage7",    ifdTagList                     },
Packit 01d647
        { subImage8Id,     "SubImage8", "SubImage8",    ifdTagList                     },
Packit 01d647
        { subImage9Id,     "SubImage9", "SubImage9",    ifdTagList                     },
Packit 01d647
        { subThumb1Id,     "SubThumb1", "SubThumb1",    ifdTagList                     },
Packit 01d647
        { panaRawId,       "PanaRaw",   "PanasonicRaw", PanasonicMakerNote::tagListRaw },
Packit 01d647
        { mnId,            "Makernote", "MakerNote",    mnTagList                      },
Packit 01d647
        { canonId,         "Makernote", "Canon",        CanonMakerNote::tagList        },
Packit 01d647
        { canonCsId,       "Makernote", "CanonCs",      CanonMakerNote::tagListCs      },
Packit 01d647
        { canonSiId,       "Makernote", "CanonSi",      CanonMakerNote::tagListSi      },
Packit 01d647
        { canonCfId,       "Makernote", "CanonCf",      CanonMakerNote::tagListCf      },
Packit 01d647
        { canonPiId,       "Makernote", "CanonPi",      CanonMakerNote::tagListPi      },
Packit 01d647
        { canonTiId,       "Makernote", "CanonTi",      CanonMakerNote::tagListTi      },
Packit 01d647
        { canonFiId,       "Makernote", "CanonFi",      CanonMakerNote::tagListFi      },
Packit 01d647
        { canonPaId,       "Makernote", "CanonPa",      CanonMakerNote::tagListPa      },
Packit 01d647
        { canonPrId,       "Makernote", "CanonPr",      CanonMakerNote::tagListPr      },
Packit 01d647
        { casioId,         "Makernote", "Casio",        CasioMakerNote::tagList        },
Packit 01d647
        { casio2Id,        "Makernote", "Casio2",       Casio2MakerNote::tagList       },
Packit 01d647
        { fujiId,          "Makernote", "Fujifilm",     FujiMakerNote::tagList         },
Packit 01d647
        { minoltaId,       "Makernote", "Minolta",      MinoltaMakerNote::tagList      },
Packit 01d647
        { minoltaCs5DId,   "Makernote", "MinoltaCs5D",  MinoltaMakerNote::tagListCs5D  },
Packit 01d647
        { minoltaCs7DId,   "Makernote", "MinoltaCs7D",  MinoltaMakerNote::tagListCs7D  },
Packit 01d647
        { minoltaCsOldId,  "Makernote", "MinoltaCsOld", MinoltaMakerNote::tagListCsStd },
Packit 01d647
        { minoltaCsNewId,  "Makernote", "MinoltaCsNew", MinoltaMakerNote::tagListCsStd },
Packit 01d647
        { nikon1Id,        "Makernote", "Nikon1",       Nikon1MakerNote::tagList       },
Packit 01d647
        { nikon2Id,        "Makernote", "Nikon2",       Nikon2MakerNote::tagList       },
Packit 01d647
        { nikon3Id,        "Makernote", "Nikon3",       Nikon3MakerNote::tagList       },
Packit 01d647
        { nikonPvId,       "Makernote", "NikonPreview", ifdTagList                     },
Packit 01d647
        { nikonVrId,       "Makernote", "NikonVr",      Nikon3MakerNote::tagListVr     },
Packit 01d647
        { nikonPcId,       "Makernote", "NikonPc",      Nikon3MakerNote::tagListPc     },
Packit 01d647
        { nikonWtId,       "Makernote", "NikonWt",      Nikon3MakerNote::tagListWt     },
Packit 01d647
        { nikonIiId,       "Makernote", "NikonIi",      Nikon3MakerNote::tagListIi     },
Packit 01d647
        { nikonAfId,       "Makernote", "NikonAf",      Nikon3MakerNote::tagListAf     },
Packit 01d647
        { nikonAf21Id,     "Makernote", "NikonAf2",     Nikon3MakerNote::tagListAf21   },
Packit 01d647
        { nikonAf22Id,     "Makernote", "NikonAf22",    Nikon3MakerNote::tagListAf22   },
Packit 01d647
        { nikonAFTId,      "Makernote", "NikonAFT",     Nikon3MakerNote::tagListAFT    },
Packit 01d647
        { nikonFiId,       "Makernote", "NikonFi",      Nikon3MakerNote::tagListFi     },
Packit 01d647
        { nikonMeId,       "Makernote", "NikonMe",      Nikon3MakerNote::tagListMe     },
Packit 01d647
        { nikonFl1Id,      "Makernote", "NikonFl1",     Nikon3MakerNote::tagListFl1    },
Packit 01d647
        { nikonFl2Id,      "Makernote", "NikonFl2",     Nikon3MakerNote::tagListFl2    },
Packit 01d647
        { nikonFl3Id,      "Makernote", "NikonFl3",     Nikon3MakerNote::tagListFl3    },
Packit 01d647
        { nikonSi1Id,      "Makernote", "NikonSiD80",   Nikon3MakerNote::tagListSi1    },
Packit 01d647
        { nikonSi2Id,      "Makernote", "NikonSiD40",   Nikon3MakerNote::tagListSi2    },
Packit 01d647
        { nikonSi3Id,      "Makernote", "NikonSiD300a", Nikon3MakerNote::tagListSi3    },
Packit 01d647
        { nikonSi4Id,      "Makernote", "NikonSiD300b", Nikon3MakerNote::tagListSi4    },
Packit 01d647
        { nikonSi5Id,      "Makernote", "NikonSi02xx",  Nikon3MakerNote::tagListSi5    },
Packit 01d647
        { nikonSi6Id,      "Makernote", "NikonSi01xx",  Nikon3MakerNote::tagListSi5    },
Packit 01d647
        { nikonCb1Id,      "Makernote", "NikonCb1",     Nikon3MakerNote::tagListCb1    },
Packit 01d647
        { nikonCb2Id,      "Makernote", "NikonCb2",     Nikon3MakerNote::tagListCb2    },
Packit 01d647
        { nikonCb2aId,     "Makernote", "NikonCb2a",    Nikon3MakerNote::tagListCb2a   },
Packit 01d647
        { nikonCb2bId,     "Makernote", "NikonCb2b",    Nikon3MakerNote::tagListCb2b   },
Packit 01d647
        { nikonCb3Id,      "Makernote", "NikonCb3",     Nikon3MakerNote::tagListCb3    },
Packit 01d647
        { nikonCb4Id,      "Makernote", "NikonCb4",     Nikon3MakerNote::tagListCb4    },
Packit 01d647
        { nikonLd1Id,      "Makernote", "NikonLd1",     Nikon3MakerNote::tagListLd1    },
Packit 01d647
        { nikonLd2Id,      "Makernote", "NikonLd2",     Nikon3MakerNote::tagListLd2    },
Packit 01d647
        { nikonLd3Id,      "Makernote", "NikonLd3",     Nikon3MakerNote::tagListLd3    },
Packit 01d647
        { olympusId,       "Makernote", "Olympus",      OlympusMakerNote::tagList      },
Packit 01d647
        { olympus2Id,      "Makernote", "Olympus2",     OlympusMakerNote::tagList      },
Packit 01d647
        { olympusCsId,     "Makernote", "OlympusCs",    OlympusMakerNote::tagListCs    },
Packit 01d647
        { olympusEqId,     "Makernote", "OlympusEq",    OlympusMakerNote::tagListEq    },
Packit 01d647
        { olympusRdId,     "Makernote", "OlympusRd",    OlympusMakerNote::tagListRd    },
Packit 01d647
        { olympusRd2Id,    "Makernote", "OlympusRd2",   OlympusMakerNote::tagListRd2   },
Packit 01d647
        { olympusIpId,     "Makernote", "OlympusIp",    OlympusMakerNote::tagListIp    },
Packit 01d647
        { olympusFiId,     "Makernote", "OlympusFi",    OlympusMakerNote::tagListFi    },
Packit 01d647
        { olympusFe1Id,    "Makernote", "OlympusFe1",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe2Id,    "Makernote", "OlympusFe2",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe3Id,    "Makernote", "OlympusFe3",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe4Id,    "Makernote", "OlympusFe4",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe5Id,    "Makernote", "OlympusFe5",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe6Id,    "Makernote", "OlympusFe6",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe7Id,    "Makernote", "OlympusFe7",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe8Id,    "Makernote", "OlympusFe8",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusFe9Id,    "Makernote", "OlympusFe9",   OlympusMakerNote::tagListFe    },
Packit 01d647
        { olympusRiId,     "Makernote", "OlympusRi",    OlympusMakerNote::tagListRi    },
Packit 01d647
        { panasonicId,     "Makernote", "Panasonic",    PanasonicMakerNote::tagList    },
Packit 01d647
        { pentaxDngId,     "Makernote", "PentaxDng",    PentaxMakerNote::tagList       },
Packit 01d647
        { pentaxId,        "Makernote", "Pentax",       PentaxMakerNote::tagList       },
Packit 01d647
        { samsung2Id,      "Makernote", "Samsung2",     Samsung2MakerNote::tagList     },
Packit 01d647
        { samsungPvId,     "Makernote", "SamsungPreview", ifdTagList                   },
Packit 01d647
        { samsungPwId,     "Makernote", "SamsungPictureWizard", Samsung2MakerNote::tagListPw },
Packit 01d647
        { sigmaId,         "Makernote", "Sigma",        SigmaMakerNote::tagList        },
Packit 01d647
        { sony1Id,         "Makernote", "Sony1",        SonyMakerNote::tagList         },
Packit 01d647
        { sony2Id,         "Makernote", "Sony2",        SonyMakerNote::tagList         },
Packit 01d647
        { sonyMltId,       "Makernote", "SonyMinolta",  MinoltaMakerNote::tagList      },
Packit 01d647
        { sony1CsId,       "Makernote", "Sony1Cs",      SonyMakerNote::tagListCs       },
Packit 01d647
        { sony1Cs2Id,      "Makernote", "Sony1Cs2",     SonyMakerNote::tagListCs2      },
Packit 01d647
        { sony1MltCs7DId,  "Makernote", "Sony1MltCs7D", MinoltaMakerNote::tagListCs7D  },
Packit 01d647
        { sony1MltCsOldId, "Makernote", "Sony1MltCsOld",MinoltaMakerNote::tagListCsStd },
Packit 01d647
        { sony1MltCsNewId, "Makernote", "Sony1MltCsNew",MinoltaMakerNote::tagListCsStd },
Packit 01d647
        { sony1MltCsA100Id,"Makernote", "Sony1MltCsA100",MinoltaMakerNote::tagListCsA100},
Packit 01d647
        { sony2CsId,       "Makernote", "Sony2Cs",      SonyMakerNote::tagListCs       },
Packit 01d647
        { sony2Cs2Id,      "Makernote", "Sony2Cs2",     SonyMakerNote::tagListCs2      },
Packit 01d647
        { sony2FpId,       "Makernote", "Sony2Fp",      SonyMakerNote::tagListFp       },
Packit Service fb147c
        { sony2010eId,     "Makernote", "Sony2010e",    SonyMakerNote::tagList2010e    },
Packit 01d647
        { lastId,          "(Last IFD info)", "(Last IFD item)", 0 }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Units for measuring X and Y resolution, tags 0x0128, 0xa210
Packit 01d647
    extern const TagDetails exifUnit[] = {
Packit 01d647
        { 1, N_("none") },
Packit 01d647
        { 2, N_("inch") },
Packit 01d647
        { 3, N_("cm")   }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS altitude reference, tag 0x0005
Packit 01d647
    extern const TagDetails exifGPSAltitudeRef[] = {
Packit 01d647
        { 0, N_("Above sea level") },
Packit 01d647
        { 1, N_("Below sea level") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS status, tag 0x0009
Packit 01d647
    extern const TagDetails exifGPSStatus[] = {
Packit 01d647
        { 'A', N_("Measurement in progress")      },
Packit 01d647
        { 'V', N_("Measurement Interoperability") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS measurement mode, tag 0x000a
Packit 01d647
    extern const TagDetails exifGPSMeasureMode[] = {
Packit 01d647
        { '2', N_("Two-dimensional measurement")   },
Packit 01d647
        { '3', N_("Three-dimensional measurement") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS speed reference, tag 0x000c
Packit 01d647
    extern const TagDetails exifGPSSpeedRef[] = {
Packit 01d647
        { 'K', N_("km/h")  },
Packit 01d647
        { 'M', N_("mph")   },
Packit 01d647
        { 'N', N_("knots") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS Destination distance ref, tag 0x0019
Packit 01d647
    extern const TagDetails exifGPSDestDistanceRef[] = {
Packit 01d647
        { 'K', N_("Kilometers") },
Packit 01d647
        { 'M', N_("Miles")      },
Packit 01d647
        { 'N', N_("Knots")      }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS Differential, tag 0x001e
Packit 01d647
    extern const TagDetails exifGPSDifferential[] = {
Packit 01d647
        { 0, N_("Without correction") },
Packit 01d647
        { 1, N_("Correction applied") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Orientation, tag 0x0112
Packit 01d647
    extern const TagDetails exifOrientation[] = {
Packit 01d647
        { 1, N_("top, left")     },
Packit 01d647
        { 2, N_("top, right")    },
Packit 01d647
        { 3, N_("bottom, right") },
Packit 01d647
        { 4, N_("bottom, left")  },
Packit 01d647
        { 5, N_("left, top")     },
Packit 01d647
        { 6, N_("right, top")    },
Packit 01d647
        { 7, N_("right, bottom") },
Packit 01d647
        { 8, N_("left, bottom")  },
Packit 01d647
        { 8, N_("left, bottom")  }              // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Predictor, tag 0x013d
Packit 01d647
    extern const TagDetails exifPredictor[] = {
Packit 01d647
        { 1, N_("No prediction scheme used") },
Packit 01d647
        { 2, N_("Horizontal differencing")   }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! InkSet, tag 0x014c
Packit 01d647
    extern const TagDetails exifInkSet[] = {
Packit 01d647
        { 1, N_("CMYK")     },
Packit 01d647
        { 2, N_("not CMYK") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! NewSubfileType, TIFF tag 0x00fe - this is actually a bitmask
Packit 01d647
    extern const TagDetails exifNewSubfileType[] = {
Packit 01d647
        {  0, N_("Primary image")                                               },
Packit 01d647
        {  1, N_("Thumbnail/Preview image")                                     },
Packit 01d647
        {  2, N_("Primary image, Multi page file")                              },
Packit 01d647
        {  3, N_("Thumbnail/Preview image, Multi page file")                    },
Packit 01d647
        {  4, N_("Primary image, Transparency mask")                            },
Packit 01d647
        {  5, N_("Thumbnail/Preview image, Transparency mask")                  },
Packit 01d647
        {  6, N_("Primary image, Multi page file, Transparency mask")           },
Packit 01d647
        {  7, N_("Thumbnail/Preview image, Multi page file, Transparency mask") },
Packit 01d647
        {  7, N_("Thumbnail/Preview image, Multi page file, Transparency mask") }  // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! SubfileType, TIFF tag 0x00ff
Packit 01d647
    extern const TagDetails exifSubfileType[] = {
Packit 01d647
        {  1, N_("Full-resolution image data")                                  },
Packit 01d647
        {  2, N_("Reduced-resolution image data")                               },
Packit 01d647
        {  3, N_("A single page of a multi-page image")                         }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Compression, tag 0x0103
Packit 01d647
    extern const TagDetails exifCompression[] = {
Packit 01d647
        {     1, N_("Uncompressed")             },
Packit 01d647
        {     2, N_("CCITT RLE")                },
Packit 01d647
        {     3, N_("T4/Group 3 Fax")           },
Packit 01d647
        {     4, N_("T6/Group 4 Fax")           },
Packit 01d647
        {     5, N_("LZW")                      },
Packit 01d647
        {     6, N_("JPEG (old-style)")         },
Packit 01d647
        {     7, N_("JPEG")                     },
Packit 01d647
        {     8, N_("Adobe Deflate")            },
Packit 01d647
        {     9, N_("JBIG B&W")                 },
Packit 01d647
        {    10, N_("JBIG Color")               },
Packit 01d647
        { 32766, N_("Next 2-bits RLE")          },
Packit 01d647
        { 32769, N_("Epson ERF Compressed")     },
Packit 01d647
        { 32770, N_("Samsung SRW Compressed")   },
Packit 01d647
        { 32771, N_("CCITT RLE 1-word")         },
Packit 01d647
        { 32773, N_("PackBits (Macintosh RLE)") },
Packit 01d647
        { 32809, N_("Thunderscan RLE")          },
Packit 01d647
        { 32895, N_("IT8 CT Padding")           },
Packit 01d647
        { 32896, N_("IT8 Linework RLE")         },
Packit 01d647
        { 32897, N_("IT8 Monochrome Picture")   },
Packit 01d647
        { 32898, N_("IT8 Binary Lineart")       },
Packit 01d647
        { 32908, N_("Pixar Film (10-bits LZW)") },
Packit 01d647
        { 32909, N_("Pixar Log (11-bits ZIP)")  },
Packit 01d647
        { 32946, N_("Pixar Deflate")            },
Packit 01d647
        { 32947, N_("Kodak DCS Encoding")       },
Packit 01d647
        { 34661, N_("ISO JBIG")                 },
Packit 01d647
        { 34676, N_("SGI Log Luminance RLE")    },
Packit 01d647
        { 34677, N_("SGI Log 24-bits packed")   },
Packit 01d647
        { 34712, N_("Leadtools JPEG 2000")      },
Packit 01d647
        { 34713, N_("Nikon NEF Compressed")     },
Packit 01d647
        { 65000, N_("Kodak DCR Compressed")     },
Packit 01d647
        { 65535, N_("Pentax PEF Compressed")    }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! PhotometricInterpretation, tag 0x0106
Packit 01d647
    extern const TagDetails exifPhotometricInterpretation[] = {
Packit 01d647
        {     0, N_("White Is Zero")      },
Packit 01d647
        {     1, N_("Black Is Zero")      },
Packit 01d647
        {     2, N_("RGB")                },
Packit 01d647
        {     3, N_("RGB Palette")        },
Packit 01d647
        {     4, N_("Transparency Mask")  },
Packit 01d647
        {     5, N_("CMYK")               },
Packit 01d647
        {     6, N_("YCbCr")              },
Packit 01d647
        {     8, N_("CIELab")             },
Packit 01d647
        {     9, N_("ICCLab")             },
Packit 01d647
        {    10, N_("ITULab")             },
Packit 01d647
        { 32803, N_("Color Filter Array") },
Packit 01d647
        { 32844, N_("Pixar LogL")         },
Packit 01d647
        { 32845, N_("Pixar LogLuv")       },
Packit 01d647
        { 34892, N_("Linear Raw")         }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Thresholding, tag 0x0107
Packit 01d647
    extern const TagDetails exifThresholding[] = {
Packit 01d647
        { 1, N_("No dithering or halftoning")           },
Packit 01d647
        { 2, N_("Ordered dither or halftone technique") },
Packit 01d647
        { 3, N_("Randomized process")                   }
Packit 01d647
    };
Packit 01d647
Packit 01d647
Packit 01d647
    //! SampleFormat, tag 0x0153
Packit 01d647
    extern const TagDetails exifSampleFormat[] = {
Packit 01d647
        { 1, N_("Unsigned integer data")                },
Packit 01d647
        { 2, N_("Two's complement signed integer data") },
Packit 01d647
        { 3, N_("IEEE floating point data")             },
Packit 01d647
        { 4, N_("Undefined data format")                },
Packit 01d647
        { 4, N_("Undefined data format")                } // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Indexed, tag 0x015a
Packit 01d647
    extern const TagDetails exifIndexed[] = {
Packit 01d647
        { 0, N_("Not indexed") },
Packit 01d647
        { 1, N_("Indexed")     }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! exifJpegLosslessPredictor, tag 0x0205
Packit 01d647
    extern const TagDetails exifJpegLosslessPredictor[] = {
Packit 01d647
        { 1, N_("A")           },
Packit 01d647
        { 2, N_("B")           },
Packit 01d647
        { 3, N_("C")           },
Packit 01d647
        { 4, N_("A+B-C")       },
Packit 01d647
        { 5, N_("A+((B-C)/2)") },
Packit 01d647
        { 6, N_("B+((A-C)/2)") },
Packit 01d647
        { 7, N_("(A+B)/2")     }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! Flash, Exif tag 0x9209
Packit 01d647
    extern const TagDetails exifFlash[] = {
Packit 01d647
        { 0x00, N_("No flash")                                                      },
Packit 01d647
        { 0x01, N_("Fired")                                                         },
Packit 01d647
        { 0x05, N_("Fired, return light not detected")                              },
Packit 01d647
        { 0x07, N_("Fired, return light detected")                                  },
Packit 01d647
        { 0x08, N_("Yes, did not fire")                                             },
Packit 01d647
        { 0x09, N_("Yes, compulsory")                                               },
Packit 01d647
        { 0x0d, N_("Yes, compulsory, return light not detected")                    },
Packit 01d647
        { 0x0f, N_("Yes, compulsory, return light detected")                        },
Packit 01d647
        { 0x10, N_("No, compulsory")                                                },
Packit 01d647
        { 0x14, N_("No, did not fire, return light not detected")                   },
Packit 01d647
        { 0x18, N_("No, auto")                                                      },
Packit 01d647
        { 0x19, N_("Yes, auto")                                                     },
Packit 01d647
        { 0x1d, N_("Yes, auto, return light not detected")                          },
Packit 01d647
        { 0x1f, N_("Yes, auto, return light detected")                              },
Packit 01d647
        { 0x20, N_("No flash function")                                             },
Packit 01d647
        { 0x20, N_("No, no flash function")                                         },
Packit 01d647
        { 0x41, N_("Yes, red-eye reduction")                                        },
Packit 01d647
        { 0x45, N_("Yes, red-eye reduction, return light not detected")             },
Packit 01d647
        { 0x47, N_("Yes, red-eye reduction, return light detected")                 },
Packit 01d647
        { 0x49, N_("Yes, compulsory, red-eye reduction")                            },
Packit 01d647
        { 0x4d, N_("Yes, compulsory, red-eye reduction, return light not detected") },
Packit 01d647
        { 0x4f, N_("Yes, compulsory, red-eye reduction, return light detected")     },
Packit 01d647
        { 0x50, N_("No, red-eye reduction")                                         },
Packit 01d647
        { 0x58, N_("No, auto, red-eye reduction")                                   },
Packit 01d647
        { 0x59, N_("Yes, auto, red-eye reduction")                                  },
Packit 01d647
        { 0x5d, N_("Yes, auto, red-eye reduction, return light not detected")       },
Packit 01d647
        { 0x5f, N_("Yes, auto, red-eye reduction, return light detected")           }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! CFALayout, tag 0xc617
Packit 01d647
    extern const TagDetails exifCfaLayout[] = {
Packit 01d647
        { 1, N_("Rectangular (or square) layout") },
Packit 01d647
        { 2, N_("Staggered layout A: even columns are offset down by 1/2 row")  },
Packit 01d647
        { 3, N_("Staggered layout B: even columns are offset up by 1/2 row")    },
Packit 01d647
        { 4, N_("Staggered layout C: even rows are offset right by 1/2 column") },
Packit 01d647
        { 5, N_("Staggered layout D: even rows are offset left by 1/2 column")  }
Packit 01d647
    };
Packit 01d647
Packit 01d647
Packit 01d647
    //! Base IFD Tags (IFD0 and IFD1)
Packit 01d647
    static const TagInfo ifdTagInfo[] = {
Packit 01d647
        TagInfo(0x000b, "ProcessingSoftware", N_("Processing Software"),
Packit 01d647
                N_("The name and version of the software used to post-process "
Packit 01d647
                   "the picture."), // ACD Systems Digital Imaging tag
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x00fe, "NewSubfileType", N_("New Subfile Type"),
Packit 01d647
                N_("A general indication of the kind of data contained in this subfile."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, 1, EXV_PRINT_TAG(exifNewSubfileType)), // TIFF tag
Packit 01d647
        TagInfo(0x00ff, "SubfileType", N_("Subfile Type"),
Packit 01d647
                N_("A general indication of the kind of data contained in this subfile. "
Packit 01d647
                   "This field is deprecated. The NewSubfileType field should be used instead."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifSubfileType)), // TIFF tag
Packit 01d647
        TagInfo(0x0100, "ImageWidth", N_("Image Width"),
Packit 01d647
                N_("The number of columns of image data, equal to the number of "
Packit 01d647
                "pixels per row. In JPEG compressed data a JPEG marker is "
Packit 01d647
                "used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0101, "ImageLength", N_("Image Length"),
Packit 01d647
                N_("The number of rows of image data. In JPEG compressed data a "
Packit 01d647
                "JPEG marker is used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0102, "BitsPerSample", N_("Bits per Sample"),
Packit 01d647
                N_("The number of bits per image component. In this standard each "
Packit 01d647
                "component of the image is 8 bits, so the value for this "
Packit 01d647
                "tag is 8. See also <SamplesPerPixel>. In JPEG compressed data "
Packit 01d647
                "a JPEG marker is used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 3, printValue),
Packit 01d647
        TagInfo(0x0103, "Compression", N_("Compression"),
Packit 01d647
                N_("The compression scheme used for the image data. When a "
Packit 01d647
                "primary image is JPEG compressed, this designation is "
Packit 01d647
                "not necessary and is omitted. When thumbnails use JPEG "
Packit 01d647
                "compression, this tag value is set to 6."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifCompression)),
Packit 01d647
        TagInfo(0x0106, "PhotometricInterpretation", N_("Photometric Interpretation"),
Packit 01d647
                N_("The pixel composition. In JPEG compressed data a JPEG "
Packit 01d647
                "marker is used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPhotometricInterpretation)),
Packit 01d647
        TagInfo(0x0107, "Thresholding", N_("Thresholding"),
Packit 01d647
                N_("For black and white TIFF files that represent shades of gray, "
Packit 01d647
                   "the technique used to convert from gray to black and white pixels."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifThresholding)), // TIFF tag
Packit 01d647
        TagInfo(0x0108, "CellWidth", N_("Cell Width"),
Packit 01d647
                N_("The width of the dithering or halftoning matrix used to create a "
Packit 01d647
                   "dithered or halftoned bilevel file."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0109, "CellLength", N_("Cell Length"),
Packit 01d647
                N_("The length of the dithering or halftoning matrix used to create a "
Packit 01d647
                   "dithered or halftoned bilevel file."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x010a, "FillOrder", N_("Fill Order"),
Packit 01d647
                N_("The logical order of bits within a byte"),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x010d, "DocumentName", N_("Document Name"),
Packit 01d647
                N_("The name of the document from which this image was scanned"),
Packit 01d647
                ifd0Id, imgStruct, asciiString, 0, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x010e, "ImageDescription", N_("Image Description"),
Packit 01d647
                N_("A character string giving the title of the image. It may be "
Packit 01d647
                "a comment such as \"1988 company picnic\" or "
Packit 01d647
                "the like. Two-bytes character codes cannot be used. "
Packit 01d647
                "When a 2-bytes code is necessary, the Exif Private tag "
Packit 01d647
                "<UserComment> is to be used."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x010f, "Make", N_("Manufacturer"),
Packit 01d647
                N_("The manufacturer of the recording "
Packit 01d647
                "equipment. This is the manufacturer of the DSC, scanner, "
Packit 01d647
                "video digitizer or other equipment that generated the "
Packit 01d647
                "image. When the field is left blank, it is treated as unknown."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0110, "Model", N_("Model"),
Packit 01d647
                N_("The model name or model number of the equipment. This is the "
Packit 01d647
                "model name or number of the DSC, scanner, video digitizer "
Packit 01d647
                "or other equipment that generated the image. When the field "
Packit 01d647
                "is left blank, it is treated as unknown."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0111, "StripOffsets", N_("Strip Offsets"),
Packit 01d647
                N_("For each strip, the byte offset of that strip. It is "
Packit 01d647
                "recommended that this be selected so the number of strip "
Packit 01d647
                "bytes does not exceed 64 Kbytes. With JPEG compressed "
Packit 01d647
                "data this designation is not needed and is omitted. See also "
Packit 01d647
                "<RowsPerStrip> and <StripByteCounts>."),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, -1, printValue),
Packit 01d647
        TagInfo(0x0112, "Orientation", N_("Orientation"),
Packit 01d647
                N_("The image orientation viewed in terms of rows and columns."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, print0x0112),
Packit 01d647
        TagInfo(0x0115, "SamplesPerPixel", N_("Samples per Pixel"),
Packit 01d647
                N_("The number of components per pixel. Since this standard applies "
Packit 01d647
                "to RGB and YCbCr images, the value set for this tag is 3. "
Packit 01d647
                "In JPEG compressed data a JPEG marker is used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue),
Packit 01d647
        TagInfo(0x0116, "RowsPerStrip", N_("Rows per Strip"),
Packit 01d647
                N_("The number of rows per strip. This is the number of rows "
Packit 01d647
                "in the image of one strip when an image is divided into "
Packit 01d647
                "strips. With JPEG compressed data this designation is not "
Packit 01d647
                "needed and is omitted. See also <StripOffsets> and <StripByteCounts>."),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0117, "StripByteCounts", N_("Strip Byte Count"),
Packit 01d647
                N_("The total number of bytes in each strip. With JPEG compressed "
Packit 01d647
                "data this designation is not needed and is omitted."),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, -1, printValue),
Packit 01d647
        TagInfo(0x011a, "XResolution", N_("X-Resolution"),
Packit 01d647
                N_("The number of pixels per <ResolutionUnit> in the <ImageWidth> "
Packit 01d647
                "direction. When the image resolution is unknown, 72 [dpi] is designated."),
Packit 01d647
                ifd0Id, imgStruct, unsignedRational, 1, printLong),
Packit 01d647
        TagInfo(0x011b, "YResolution", N_("Y-Resolution"),
Packit 01d647
                N_("The number of pixels per <ResolutionUnit> in the <ImageLength> "
Packit 01d647
                "direction. The same value as <XResolution> is designated."),
Packit 01d647
                ifd0Id, imgStruct, unsignedRational, 1, printLong),
Packit 01d647
        TagInfo(0x011c, "PlanarConfiguration", N_("Planar Configuration"),
Packit 01d647
                N_("Indicates whether pixel components are recorded in a chunky "
Packit 01d647
                "or planar format. In JPEG compressed files a JPEG marker "
Packit 01d647
                "is used instead of this tag. If this field does not exist, "
Packit 01d647
                "the TIFF default of 1 (chunky) is assumed."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue),
Packit 01d647
        TagInfo(0x0122, "GrayResponseUnit", N_("Gray Response Unit"),
Packit 01d647
                N_("The precision of the information contained in the GrayResponseCurve."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0123, "GrayResponseCurve", N_("Gray Response Curve"),
Packit 01d647
                N_("For grayscale data, the optical density of each possible pixel value."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0124, "T4Options", N_("T4 Options"),
Packit 01d647
                N_("T.4-encoding options."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0125, "T6Options", N_("T6 Options"),
Packit 01d647
                N_("T.6-encoding options."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0128, "ResolutionUnit", N_("Resolution Unit"),
Packit 01d647
                N_("The unit for measuring <XResolution> and <YResolution>. The same "
Packit 01d647
                "unit is used for both <XResolution> and <YResolution>. If "
Packit 01d647
                "the image resolution is unknown, 2 (inches) is designated."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printExifUnit),
Packit 01d647
        TagInfo(0x0129, "PageNumber", N_("Page Number"),
Packit 01d647
                N_("The page number of the page from which this image was scanned."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 2, printValue),
Packit 01d647
        TagInfo(0x012d, "TransferFunction", N_("Transfer Function"),
Packit 01d647
                N_("A transfer function for the image, described in tabular style. "
Packit 01d647
                "Normally this tag is not necessary, since color space is "
Packit 01d647
                "specified in the color space information tag (<ColorSpace>)."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedShort, 3*256, printValue),
Packit 01d647
        TagInfo(0x0131, "Software", N_("Software"),
Packit 01d647
                N_("This tag records the name and version of the software or "
Packit 01d647
                "firmware of the camera or image input device used to "
Packit 01d647
                "generate the image. The detailed format is not specified, but "
Packit 01d647
                "it is recommended that the example shown below be "
Packit 01d647
                "followed. When the field is left blank, it is treated as unknown."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0132, "DateTime", N_("Date and Time"),
Packit 01d647
                N_("The date and time of image creation. In Exif standard, "
Packit 01d647
                "it is the date and time the file was changed."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 20, printValue),
Packit 01d647
        TagInfo(0x013b, "Artist", N_("Artist"),
Packit 01d647
                N_("This tag records the name of the camera owner, photographer or "
Packit 01d647
                "image creator. The detailed format is not specified, but it is "
Packit 01d647
                "recommended that the information be written as in the example "
Packit 01d647
                "below for ease of Interoperability. When the field is "
Packit 01d647
                "left blank, it is treated as unknown. Ex.) \"Camera owner, John "
Packit 01d647
                "Smith; Photographer, Michael Brown; Image creator, Ken James\""),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x013c, "HostComputer", N_("Host Computer"),
Packit 01d647
                N_("This tag records information about the host computer used "
Packit 01d647
                "to generate the image."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x013d, "Predictor", N_("Predictor"),
Packit 01d647
                N_("A predictor is a mathematical operator that is applied to "
Packit 01d647
                   "the image data before an encoding scheme is applied."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPredictor)), // TIFF tag
Packit 01d647
        TagInfo(0x013e, "WhitePoint", N_("White Point"),
Packit 01d647
                N_("The chromaticity of the white point of the image. Normally "
Packit 01d647
                "this tag is not necessary, since color space is specified "
Packit 01d647
                "in the colorspace information tag (<ColorSpace>)."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedRational, 2, printValue),
Packit 01d647
        TagInfo(0x013f, "PrimaryChromaticities", N_("Primary Chromaticities"),
Packit 01d647
                N_("The chromaticity of the three primary colors of the image. "
Packit 01d647
                "Normally this tag is not necessary, since colorspace is "
Packit 01d647
                "specified in the colorspace information tag (<ColorSpace>)."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedRational, 6, printValue),
Packit 01d647
        TagInfo(0x0140, "ColorMap", N_("Color Map"),
Packit 01d647
                N_("A color map for palette color images. This field defines "
Packit 01d647
                   "a Red-Green-Blue color map (often called a lookup table) "
Packit 01d647
                   "for palette-color images. In a palette-color image, a "
Packit 01d647
                   "pixel value is used to index into an RGB lookup table."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedShort, -1, printValue),
Packit 01d647
        TagInfo(0x0141, "HalftoneHints", N_("Halftone Hints"),
Packit 01d647
                N_("The purpose of the HalftoneHints field is to convey to the "
Packit 01d647
                   "halftone function the range of gray levels within a "
Packit 01d647
                   "colorimetrically-specified image that should retain tonal detail."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 2, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0142, "TileWidth", N_("Tile Width"),
Packit 01d647
                N_("The tile width in pixels. This is the number of columns in each tile."),
Packit 01d647
                ifd0Id, recOffset, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0143, "TileLength", N_("Tile Length"),
Packit 01d647
                N_("The tile length (height) in pixels. This is the number of rows in each tile."),
Packit 01d647
                ifd0Id, recOffset, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0144, "TileOffsets", N_("Tile Offsets"),
Packit 01d647
                N_("For each tile, the byte offset of that tile, as compressed and "
Packit 01d647
                   "stored on disk. The offset is specified with respect to the "
Packit 01d647
                   "beginning of the TIFF file. Note that this implies that each "
Packit 01d647
                   "tile has a location independent of the locations of other tiles."),
Packit 01d647
                ifd0Id, recOffset, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0145, "TileByteCounts", N_("Tile Byte Counts"),
Packit 01d647
                N_("For each tile, the number of (compressed) bytes in that tile. See "
Packit 01d647
                   "TileOffsets for a description of how the byte counts are ordered."),
Packit 01d647
                ifd0Id, recOffset, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x014a, "SubIFDs", N_("SubIFD Offsets"),
Packit 01d647
                N_("Defined by Adobe Corporation to enable TIFF Trees within a TIFF file."),
Packit 01d647
                ifd0Id, tiffEp, unsignedLong, -1, printValue),
Packit 01d647
        TagInfo(0x014c, "InkSet", N_("Ink Set"),
Packit 01d647
                N_("The set of inks used in a separated (PhotometricInterpretation=5) image."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifInkSet)), // TIFF tag
Packit 01d647
        TagInfo(0x014d, "InkNames", N_("Ink Names"),
Packit 01d647
                N_("The name of each ink used in a separated (PhotometricInterpretation=5) image."),
Packit 01d647
                ifd0Id, imgStruct, asciiString, 0, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x014e, "NumberOfInks", N_("Number Of Inks"),
Packit 01d647
                N_("The number of inks. Usually equal to SamplesPerPixel, unless there are extra samples."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0150, "DotRange", N_("Dot Range"),
Packit 01d647
                N_("The component values that correspond to a 0% dot and 100% dot."),
Packit 01d647
                ifd0Id, imgStruct, unsignedByte, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0151, "TargetPrinter", N_("Target Printer"),
Packit 01d647
                N_("A description of the printing environment for which this separation is intended."),
Packit 01d647
                ifd0Id, imgStruct, asciiString, 0, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0152, "ExtraSamples", N_("Extra Samples"),
Packit 01d647
                N_("Specifies that each pixel has m extra components whose interpretation "
Packit 01d647
                   "is defined by one of the values listed below."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0153, "SampleFormat", N_("Sample Format"),
Packit 01d647
                N_("This field specifies how to interpret each data sample in a pixel."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, EXV_PRINT_TAG(exifSampleFormat)), // TIFF tag
Packit 01d647
        TagInfo(0x0154, "SMinSampleValue", N_("SMin Sample Value"),
Packit 01d647
                N_("This field specifies the minimum sample value."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0155, "SMaxSampleValue", N_("SMax Sample Value"),
Packit 01d647
                N_("This field specifies the maximum sample value."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0156, "TransferRange", N_("Transfer Range"),
Packit 01d647
                N_("Expands the range of the TransferFunction"),
Packit 01d647
                ifd0Id, imgCharacter, unsignedShort, 6, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0157, "ClipPath", N_("Clip Path"),
Packit 01d647
                N_("A TIFF ClipPath is intended to mirror the essentials of PostScript's "
Packit 01d647
                   "path creation functionality."),
Packit 01d647
                ifd0Id, tiffPm6, unsignedByte, -1, printValue), // TIFF&PM6 tag
Packit 01d647
        TagInfo(0x0158, "XClipPathUnits", N_("X Clip Path Units"),
Packit 01d647
                N_("The number of units that span the width of the image, in terms of "
Packit 01d647
                   "integer ClipPath coordinates."),
Packit 01d647
                ifd0Id, tiffPm6, signedShort, 1, printValue), // TIFF&PM6 tag
Packit 01d647
        TagInfo(0x0159, "YClipPathUnits", N_("Y Clip Path Units"),
Packit 01d647
                N_("The number of units that span the height of the image, in terms of "
Packit 01d647
                   "integer ClipPath coordinates."),
Packit 01d647
                ifd0Id, tiffPm6, signedShort, 1, printValue), // TIFF&PM6 tag
Packit 01d647
        TagInfo(0x015a, "Indexed", N_("Indexed"),
Packit 01d647
                N_("Indexed images are images where the 'pixels' do not represent color "
Packit 01d647
                   "values, but rather an index (usually 8-bit) into a separate color "
Packit 01d647
                   "table, the ColorMap."),
Packit 01d647
                ifd0Id, tiffPm6, unsignedShort, 1, EXV_PRINT_TAG(exifIndexed)), // TIFF&PM6 tag
Packit 01d647
        TagInfo(0x015b, "JPEGTables", N_("JPEG tables"),
Packit 01d647
                N_("This optional tag may be used to encode the JPEG quantization and "
Packit 01d647
                   "Huffman tables for subsequent use by the JPEG decompression process."),
Packit 01d647
                ifd0Id, imgStruct, undefined, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x015F, "OPIProxy", N_("OPI Proxy"),
Packit 01d647
                N_("OPIProxy gives information concerning whether this image is a "
Packit 01d647
                   "low-resolution proxy of a high-resolution image (Adobe OPI)."),
Packit 01d647
                ifd0Id, adobeOpi, unsignedShort, 1, printValue), // Adobe OPI tag
Packit 01d647
        TagInfo(0x0200, "JPEGProc", N_("JPEG Process"),
Packit 01d647
                N_("This field indicates the process used to produce the compressed data"),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0201, "JPEGInterchangeFormat", N_("JPEG Interchange Format"),
Packit 01d647
                N_("The offset to the start byte (SOI) of JPEG compressed "
Packit 01d647
                "thumbnail data. This is not used for primary image JPEG data."),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0202, "JPEGInterchangeFormatLength", N_("JPEG Interchange Format Length"),
Packit 01d647
                N_("The number of bytes of JPEG compressed thumbnail data. This "
Packit 01d647
                "is not used for primary image JPEG data. JPEG thumbnails "
Packit 01d647
                "are not divided but are recorded as a continuous JPEG "
Packit 01d647
                "bitstream from SOI to EOI. Appn and COM markers should "
Packit 01d647
                "not be recorded. Compressed thumbnails must be recorded in no "
Packit 01d647
                "more than 64 Kbytes, including all other data to be recorded in APP1."),
Packit 01d647
                ifd0Id, recOffset, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0203, "JPEGRestartInterval", N_("JPEG Restart Interval"),
Packit 01d647
                N_("This Field indicates the length of the restart interval used "
Packit 01d647
                   "in the compressed image data."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0205, "JPEGLosslessPredictors", N_("JPEG Lossless Predictors"),
Packit 01d647
                N_("This Field points to a list of lossless predictor-selection "
Packit 01d647
                   "values, one per component."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, EXV_PRINT_TAG(exifJpegLosslessPredictor)), // TIFF tag
Packit 01d647
        TagInfo(0x0206, "JPEGPointTransforms", N_("JPEG Point Transforms"),
Packit 01d647
                N_("This Field points to a list of point transform values, one per component."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0207, "JPEGQTables", N_("JPEG Q-Tables"),
Packit 01d647
                N_("This Field points to a list of offsets to the quantization tables, "
Packit 01d647
                   "one per component."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0208, "JPEGDCTables", N_("JPEG DC-Tables"),
Packit 01d647
                N_("This Field points to a list of offsets to the DC Huffman tables or "
Packit 01d647
                   "the lossless Huffman tables, one per component."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0209, "JPEGACTables", N_("JPEG AC-Tables"),
Packit 01d647
                N_("This Field points to a list of offsets to the Huffman AC tables, "
Packit 01d647
                   "one per component."),
Packit 01d647
                ifd0Id, imgStruct, unsignedLong, -1, printValue), // TIFF tag
Packit 01d647
        TagInfo(0x0211, "YCbCrCoefficients", N_("YCbCr Coefficients"),
Packit 01d647
                N_("The matrix coefficients for transformation from RGB to YCbCr "
Packit 01d647
                "image data. No default is given in TIFF; but here the "
Packit 01d647
                "value given in Appendix E, \"Color Space Guidelines\", is used "
Packit 01d647
                "as the default. The color space is declared in a "
Packit 01d647
                "color space information tag, with the default being the value "
Packit 01d647
                "that gives the optimal image characteristics "
Packit 01d647
                "Interoperability this condition."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedRational, 3, printValue),
Packit 01d647
        TagInfo(0x0212, "YCbCrSubSampling", N_("YCbCr Sub-Sampling"),
Packit 01d647
                N_("The sampling ratio of chrominance components in relation to the "
Packit 01d647
                "luminance component. In JPEG compressed data a JPEG marker "
Packit 01d647
                "is used instead of this tag."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 2, printValue),
Packit 01d647
        TagInfo(0x0213, "YCbCrPositioning", N_("YCbCr Positioning"),
Packit 01d647
                N_("The position of chrominance components in relation to the "
Packit 01d647
                "luminance component. This field is designated only for "
Packit 01d647
                "JPEG compressed data or uncompressed YCbCr data. The TIFF "
Packit 01d647
                "default is 1 (centered); but when Y:Cb:Cr = 4:2:2 it is "
Packit 01d647
                "recommended in this standard that 2 (co-sited) be used to "
Packit 01d647
                "record data, in order to improve the image quality when viewed "
Packit 01d647
                "on TV systems. When this field does not exist, the reader shall "
Packit 01d647
                "assume the TIFF default. In the case of Y:Cb:Cr = 4:2:0, the "
Packit 01d647
                "TIFF default (centered) is recommended. If the reader "
Packit 01d647
                "does not have the capability of supporting both kinds of "
Packit 01d647
                "<YCbCrPositioning>, it shall follow the TIFF default regardless "
Packit 01d647
                "of the value in this field. It is preferable that readers "
Packit 01d647
                "be able to support both centered and co-sited positioning."),
Packit 01d647
                ifd0Id, imgStruct, unsignedShort, 1, print0x0213),
Packit 01d647
        TagInfo(0x0214, "ReferenceBlackWhite", N_("Reference Black/White"),
Packit 01d647
                N_("The reference black point value and reference white point "
Packit 01d647
                "value. No defaults are given in TIFF, but the values "
Packit 01d647
                "below are given as defaults here. The color space is declared "
Packit 01d647
                "in a color space information tag, with the default "
Packit 01d647
                "being the value that gives the optimal image characteristics "
Packit 01d647
                "Interoperability these conditions."),
Packit 01d647
                ifd0Id, imgCharacter, unsignedRational, 6, printValue),
Packit 01d647
        TagInfo(0x02bc, "XMLPacket", N_("XML Packet"),
Packit 01d647
                N_("XMP Metadata (Adobe technote 9-14-02)"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printValue),
Packit 01d647
        TagInfo(0x4746, "Rating", N_("Windows Rating"),
Packit 01d647
                N_("Rating tag used by Windows"),
Packit 01d647
                ifd0Id, otherTags, unsignedShort, -1, printValue), // Windows Tag
Packit 01d647
        TagInfo(0x4749, "RatingPercent", N_("Windows Rating Percent"),
Packit 01d647
                N_("Rating tag used by Windows, value in percent"),
Packit 01d647
                ifd0Id, otherTags, unsignedShort, -1, printValue), // Windows Tag
Packit 01d647
        TagInfo(0x800d, "ImageID", N_("Image ID"),
Packit 01d647
                N_("ImageID is the full pathname of the original, high-resolution image, "
Packit 01d647
                   "or any other identifying string that uniquely identifies the original "
Packit 01d647
                   "image (Adobe OPI)."),
Packit 01d647
                ifd0Id, adobeOpi, asciiString, 0, printValue), // Adobe OPI tag
Packit 01d647
        TagInfo(0x828d, "CFARepeatPatternDim", N_("CFA Repeat Pattern Dimension"),
Packit 01d647
                N_("Contains two values representing the minimum rows and columns "
Packit 01d647
                "to define the repeating patterns of the color filter array"),
Packit 01d647
                ifd0Id, tiffEp, unsignedShort, 2, printValue), // TIFF/EP Tag
Packit 01d647
        TagInfo(0x828e, "CFAPattern", N_("CFA Pattern"),
Packit 01d647
                N_("Indicates the color filter array (CFA) geometric pattern of the image "
Packit 01d647
                "sensor when a one-chip color area sensor is used. It does not apply to "
Packit 01d647
                "all sensing methods"),
Packit 01d647
                ifd0Id, tiffEp, unsignedByte, -1, printValue), // TIFF/EP Tag
Packit 01d647
        TagInfo(0x828f, "BatteryLevel", N_("Battery Level"),
Packit 01d647
                "Contains a value of the battery level as a fraction or string",
Packit 01d647
                ifd0Id, tiffEp, unsignedRational, 1, printValue), // TIFF/EP Tag
Packit 01d647
        TagInfo(0x8298, "Copyright", N_("Copyright"),
Packit 01d647
                N_("Copyright information. In this standard the tag is used to "
Packit 01d647
                "indicate both the photographer and editor copyrights. It is "
Packit 01d647
                "the copyright notice of the person or organization claiming "
Packit 01d647
                "rights to the image. The Interoperability copyright "
Packit 01d647
                "statement including date and rights should be written in this "
Packit 01d647
                "field; e.g., \"Copyright, John Smith, 19xx. All rights "
Packit 01d647
                "reserved.\". In this standard the field records both the "
Packit 01d647
                "photographer and editor copyrights, with each recorded in a "
Packit 01d647
                "separate part of the statement. When there is a clear distinction "
Packit 01d647
                "between the photographer and editor copyrights, these are to be "
Packit 01d647
                "written in the order of photographer followed by editor copyright, "
Packit 01d647
                "separated by NULL (in this case since the statement also ends with "
Packit 01d647
                "a NULL, there are two NULL codes). When only the photographer "
Packit 01d647
                "copyright is given, it is terminated by one NULL code. When only "
Packit 01d647
                "the editor copyright is given, the photographer copyright part "
Packit 01d647
                "consists of one space followed by a terminating NULL code, then "
Packit 01d647
                "the editor copyright is given. When the field is left blank, it is "
Packit 01d647
                "treated as unknown."),
Packit 01d647
                ifd0Id, otherTags, asciiString, 0, print0x8298),
Packit 01d647
        TagInfo(0x829a, "ExposureTime", N_("Exposure Time"), N_("Exposure time, given in seconds."), ifd0Id, tiffEp, unsignedRational, 1, print0x829a), // TIFF/EP tag
Packit 01d647
        TagInfo(0x829d, "FNumber", N_("FNumber"), N_("The F number."), ifd0Id, tiffEp, unsignedRational, 1, print0x829d), // TIFF/EP tag
Packit 01d647
        TagInfo(0x83bb, "IPTCNAA", N_("IPTC/NAA"),
Packit 01d647
                N_("Contains an IPTC/NAA record"),
Packit 01d647
                ifd0Id, tiffEp, unsignedLong, 0, printValue), // TIFF/EP Tag
Packit 01d647
        TagInfo(0x8649, "ImageResources", N_("Image Resources Block"),
Packit 01d647
                N_("Contains information embedded by the Adobe Photoshop application"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printValue),
Packit 01d647
        TagInfo(0x8769, "ExifTag", N_("Exif IFD Pointer"),
Packit 01d647
                N_("A pointer to the Exif IFD. Interoperability, Exif IFD has the "
Packit 01d647
                "same structure as that of the IFD specified in TIFF. "
Packit 01d647
                "ordinarily, however, it does not contain image data as in "
Packit 01d647
                "the case of TIFF."),
Packit 01d647
                ifd0Id, exifFormat, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8773, "InterColorProfile", N_("Inter Color Profile"),
Packit 01d647
                N_("Contains an InterColor Consortium (ICC) format color space characterization/profile"),
Packit 01d647
                ifd0Id, tiffEp, undefined, -1, printValue),
Packit 01d647
        TagInfo(0x8822, "ExposureProgram", N_("Exposure Program"), N_("The class of the program used by the camera to set exposure when the picture is taken."), ifd0Id, tiffEp, unsignedShort, 1, print0x8822), // TIFF/EP tag
Packit 01d647
        TagInfo(0x8824, "SpectralSensitivity", N_("Spectral Sensitivity"), N_("Indicates the spectral sensitivity of each channel of the camera used."), ifd0Id, tiffEp, asciiString, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x8825, "GPSTag", N_("GPS Info IFD Pointer"),
Packit 01d647
                N_("A pointer to the GPS Info IFD. The "
Packit 01d647
                "Interoperability structure of the GPS Info IFD, like that of "
Packit 01d647
                "Exif IFD, has no image data."),
Packit 01d647
                ifd0Id, exifFormat, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8827, "ISOSpeedRatings", N_("ISO Speed Ratings"), N_("Indicates the ISO Speed and ISO Latitude of the camera or input device as specified in ISO 12232."), ifd0Id, tiffEp, unsignedShort, 0, print0x8827), // TIFF/EP tag
Packit 01d647
        TagInfo(0x8828, "OECF", N_("OECF"), N_("Indicates the Opto-Electric Conversion Function (OECF) specified in ISO 14524."), ifd0Id, tiffEp, undefined, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x8829, "Interlace", N_("Interlace"), N_("Indicates the field number of multifield images."), ifd0Id, tiffEp, unsignedShort, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x882a, "TimeZoneOffset", N_("Time Zone Offset"),
Packit 01d647
                N_("This optional tag encodes the time zone of the camera clock (relative "
Packit 01d647
                   "to Greenwich Mean Time) used to create the DataTimeOriginal tag-value "
Packit 01d647
                   "when the picture was taken. It may also contain the time zone offset "
Packit 01d647
                   "of the clock used to create the DateTime tag-value when the image was "
Packit 01d647
                   "modified."),
Packit 01d647
                ifd0Id, tiffEp, signedShort, -1, printValue),
Packit 01d647
        TagInfo(0x882b, "SelfTimerMode", N_("Self Timer Mode"), N_("Number of seconds image capture was delayed from button press."), ifd0Id, tiffEp, unsignedShort, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9003, "DateTimeOriginal", N_("Date Time Original"), N_("The date and time when the original image data was generated."), ifd0Id, tiffEp, asciiString, 20, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9102, "CompressedBitsPerPixel", N_("Compressed Bits Per Pixel"), N_("Specific to compressed data; states the compressed bits per pixel."), ifd0Id, tiffEp, unsignedRational, 1, printFloat), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9201, "ShutterSpeedValue", N_("Shutter Speed Value"), N_("Shutter speed."), ifd0Id, tiffEp, signedRational, 1, print0x9201), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9202, "ApertureValue", N_("Aperture Value"), N_("The lens aperture."), ifd0Id, tiffEp, unsignedRational, 1, print0x9202), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9203, "BrightnessValue", N_("Brightness Value"), N_("The value of brightness."), ifd0Id, tiffEp, signedRational, 1, printFloat), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9204, "ExposureBiasValue", N_("Exposure Bias Value"), N_("The exposure bias."), ifd0Id, tiffEp, signedRational, 1, print0x9204), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9205, "MaxApertureValue", N_("Max Aperture Value"), N_("The smallest F number of the lens."), ifd0Id, tiffEp, unsignedRational, 1, print0x9202), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9206, "SubjectDistance", N_("Subject Distance"), N_("The distance to the subject, given in meters."), ifd0Id, tiffEp, signedRational, 1, print0x9206), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9207, "MeteringMode", N_("Metering Mode"), N_("The metering mode."), ifd0Id, tiffEp, unsignedShort, 1, print0x9207), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9208, "LightSource", N_("Light Source"), N_("The kind of light source."), ifd0Id, tiffEp, unsignedShort, 1, print0x9208), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9209, "Flash", N_("Flash"), N_("Indicates the status of flash when the image was shot."), ifd0Id, tiffEp, unsignedShort, 1, EXV_PRINT_TAG(exifFlash)), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920a, "FocalLength", N_("Focal Length"), N_("The actual focal length of the lens, in mm."), ifd0Id, tiffEp, unsignedRational, 1, print0x920a), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920b, "FlashEnergy", N_("Flash Energy"), N_("Amount of flash energy (BCPS)."), ifd0Id, tiffEp, unsignedRational, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920c, "SpatialFrequencyResponse", N_("Spatial Frequency Response"), N_("SFR of the camera."), ifd0Id, tiffEp, undefined, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920d, "Noise", N_("Noise"), N_("Noise measurement values."), ifd0Id, tiffEp, undefined, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920e, "FocalPlaneXResolution", N_("Focal Plane X Resolution"), N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageWidth direction for main image."), ifd0Id, tiffEp, unsignedRational, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x920f, "FocalPlaneYResolution", N_("Focal Plane Y Resolution"), N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageLength direction for main image."), ifd0Id, tiffEp, unsignedRational, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9210, "FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"), N_("Unit of measurement for FocalPlaneXResolution(37390) and FocalPlaneYResolution(37391)."), ifd0Id, tiffEp, unsignedShort, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9211, "ImageNumber", N_("Image Number"), N_("Number assigned to an image, e.g., in a chained image burst."), ifd0Id, tiffEp, unsignedLong, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9212, "SecurityClassification", N_("Security Classification"), N_("Security classification assigned to the image."), ifd0Id, tiffEp, asciiString, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9213, "ImageHistory", N_("Image History"), N_("Record of what has been done to the image."), ifd0Id, tiffEp, asciiString, 0, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9214, "SubjectLocation", N_("Subject Location"), N_("Indicates the location and area of the main subject in the overall scene."), ifd0Id, tiffEp, unsignedShort, 2, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9215, "ExposureIndex", N_("Exposure Index"), N_("Encodes the camera exposure index setting when image was captured."), ifd0Id, tiffEp, unsignedRational, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9216, "TIFFEPStandardID", N_("TIFF/EP Standard ID"),
Packit 01d647
                N_("Contains four ASCII characters representing the TIFF/EP standard "
Packit 01d647
                "version of a TIFF/EP file, eg '1', '0', '0', '0'"),
Packit 01d647
                ifd0Id, tiffEp, unsignedByte, 4, printValue), // TIFF/EP Tag
Packit 01d647
        TagInfo(0x9217, "SensingMethod", N_("Sensing Method"), N_("Type of image sensor."), ifd0Id, tiffEp, unsignedShort, 1, printValue), // TIFF/EP tag
Packit 01d647
        TagInfo(0x9c9b, "XPTitle", N_("Windows Title"),
Packit 01d647
                N_("Title tag used by Windows, encoded in UCS2"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printUcs2), // Windows Tag
Packit 01d647
        TagInfo(0x9c9c, "XPComment", N_("Windows Comment"),
Packit 01d647
                N_("Comment tag used by Windows, encoded in UCS2"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printUcs2), // Windows Tag
Packit 01d647
        TagInfo(0x9c9d, "XPAuthor", N_("Windows Author"),
Packit 01d647
                N_("Author tag used by Windows, encoded in UCS2"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printUcs2), // Windows Tag
Packit 01d647
        TagInfo(0x9c9e, "XPKeywords", N_("Windows Keywords"),
Packit 01d647
                N_("Keywords tag used by Windows, encoded in UCS2"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printUcs2), // Windows Tag
Packit 01d647
        TagInfo(0x9c9f, "XPSubject", N_("Windows Subject"),
Packit 01d647
                N_("Subject tag used by Windows, encoded in UCS2"),
Packit 01d647
                ifd0Id, otherTags, unsignedByte, -1, printUcs2), // Windows Tag
Packit 01d647
        TagInfo(0xc4a5, "PrintImageMatching", N_("Print Image Matching"),
Packit 01d647
                N_("Print Image Matching, description needed."),
Packit 01d647
                ifd0Id, otherTags, undefined, -1, printValue),
Packit 01d647
        TagInfo(0xc612, "DNGVersion", N_("DNG version"),
Packit 01d647
                N_("This tag encodes the DNG four-tier version number. For files "
Packit 01d647
                   "compliant with version 1.1.0.0 of the DNG specification, this "
Packit 01d647
                   "tag should contain the bytes: 1, 1, 0, 0."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 4, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc613, "DNGBackwardVersion", N_("DNG backward version"),
Packit 01d647
                N_("This tag specifies the oldest version of the Digital Negative "
Packit 01d647
                   "specification for which a file is compatible. Readers should"
Packit 01d647
                   "not attempt to read a file if this tag specifies a version "
Packit 01d647
                   "number that is higher than the version number of the specification "
Packit 01d647
                   "the reader was based on.  In addition to checking the version tags, "
Packit 01d647
                   "readers should, for all tags, check the types, counts, and values, "
Packit 01d647
                   "to verify it is able to correctly read the file."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 4, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc614, "UniqueCameraModel", N_("Unique Camera Model"),
Packit 01d647
                N_("Defines a unique, non-localized name for the camera model that "
Packit 01d647
                   "created the image in the raw file. This name should include the "
Packit 01d647
                   "manufacturer's name to avoid conflicts, and should not be localized, "
Packit 01d647
                   "even if the camera name itself is localized for different markets "
Packit 01d647
                   "(see LocalizedCameraModel). This string may be used by reader "
Packit 01d647
                   "software to index into per-model preferences and replacement profiles."),
Packit 01d647
                ifd0Id, dngTags, asciiString, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc615, "LocalizedCameraModel", N_("Localized Camera Model"),
Packit 01d647
                N_("Similar to the UniqueCameraModel field, except the name can be "
Packit 01d647
                   "localized for different markets to match the localization of the "
Packit 01d647
                   "camera name."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc616, "CFAPlaneColor", N_("CFA Plane Color"),
Packit 01d647
                N_("Provides a mapping between the values in the CFAPattern tag and the "
Packit 01d647
                   "plane numbers in LinearRaw space. This is a required tag for non-RGB "
Packit 01d647
                   "CFA images."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc617, "CFALayout", N_("CFA Layout"),
Packit 01d647
                N_("Describes the spatial layout of the CFA."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifCfaLayout)), // DNG tag
Packit 01d647
        TagInfo(0xc618, "LinearizationTable", N_("Linearization Table"),
Packit 01d647
                N_("Describes a lookup table that maps stored values into linear values. "
Packit 01d647
                   "This tag is typically used to increase compression ratios by storing "
Packit 01d647
                   "the raw data in a non-linear, more visually uniform space with fewer "
Packit 01d647
                   "total encoding levels. If SamplesPerPixel is not equal to one, this "
Packit 01d647
                   "single table applies to all the samples for each pixel."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc619, "BlackLevelRepeatDim", N_("Black Level Repeat Dim"),
Packit 01d647
                N_("Specifies repeat pattern size for the BlackLevel tag."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61a, "BlackLevel", N_("Black Level"),
Packit 01d647
                N_("Specifies the zero light (a.k.a. thermal black or black current) "
Packit 01d647
                   "encoding level, as a repeating pattern. The origin of this pattern "
Packit 01d647
                   "is the top-left corner of the ActiveArea rectangle. The values are "
Packit 01d647
                   "stored in row-column-sample scan order."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61b, "BlackLevelDeltaH", N_("Black Level Delta H"),
Packit 01d647
                N_("If the zero light encoding level is a function of the image column, "
Packit 01d647
                   "BlackLevelDeltaH specifies the difference between the zero light "
Packit 01d647
                   "encoding level for each column and the baseline zero light encoding "
Packit 01d647
                   "level. If SamplesPerPixel is not equal to one, this single table "
Packit 01d647
                   "applies to all the samples for each pixel."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61c, "BlackLevelDeltaV", N_("Black Level Delta V"),
Packit 01d647
                N_("If the zero light encoding level is a function of the image row, "
Packit 01d647
                   "this tag specifies the difference between the zero light encoding "
Packit 01d647
                   "level for each row and the baseline zero light encoding level. If "
Packit 01d647
                   "SamplesPerPixel is not equal to one, this single table applies to "
Packit 01d647
                   "all the samples for each pixel."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61d, "WhiteLevel", N_("White Level"),
Packit 01d647
                N_("This tag specifies the fully saturated encoding level for the raw "
Packit 01d647
                   "sample values. Saturation is caused either by the sensor itself "
Packit 01d647
                   "becoming highly non-linear in response, or by the camera's analog "
Packit 01d647
                   "to digital converter clipping."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61e, "DefaultScale", N_("Default Scale"),
Packit 01d647
                N_("DefaultScale is required for cameras with non-square pixels. It "
Packit 01d647
                   "specifies the default scale factors for each direction to convert "
Packit 01d647
                   "the image to square pixels. Typically these factors are selected "
Packit 01d647
                   "to approximately preserve total pixel count. For CFA images that "
Packit 01d647
                   "use CFALayout equal to 2, 3, 4, or 5, such as the Fujifilm SuperCCD, "
Packit 01d647
                   "these two values should usually differ by a factor of 2.0."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc61f, "DefaultCropOrigin", N_("Default Crop Origin"),
Packit 01d647
                N_("Raw images often store extra pixels around the edges of the final "
Packit 01d647
                   "image. These extra pixels help prevent interpolation artifacts near "
Packit 01d647
                   "the edges of the final image. DefaultCropOrigin specifies the origin "
Packit 01d647
                   "of the final image area, in raw image coordinates (i.e., before the "
Packit 01d647
                   "DefaultScale has been applied), relative to the top-left corner of "
Packit 01d647
                   "the ActiveArea rectangle."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc620, "DefaultCropSize", N_("Default Crop Size"),
Packit 01d647
                N_("Raw images often store extra pixels around the edges of the final "
Packit 01d647
                   "image. These extra pixels help prevent interpolation artifacts near "
Packit 01d647
                   "the edges of the final image. DefaultCropSize specifies the size of "
Packit 01d647
                   "the final image area, in raw image coordinates (i.e., before the "
Packit 01d647
                   "DefaultScale has been applied)."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc621, "ColorMatrix1", N_("Color Matrix 1"),
Packit 01d647
                N_("ColorMatrix1 defines a transformation matrix that converts XYZ "
Packit 01d647
                   "values to reference camera native color space values, under the "
Packit 01d647
                   "first calibration illuminant. The matrix values are stored in row "
Packit 01d647
                   "scan order. The ColorMatrix1 tag is required for all non-monochrome "
Packit 01d647
                   "DNG files."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc622, "ColorMatrix2", N_("Color Matrix 2"),
Packit 01d647
                N_("ColorMatrix2 defines a transformation matrix that converts XYZ "
Packit 01d647
                   "values to reference camera native color space values, under the "
Packit 01d647
                   "second calibration illuminant. The matrix values are stored in row "
Packit 01d647
                   "scan order."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc623, "CameraCalibration1", N_("Camera Calibration 1"),
Packit 01d647
                N_("CameraCalibration1 defines a calibration matrix that transforms "
Packit 01d647
                   "reference camera native space values to individual camera native "
Packit 01d647
                   "space values under the first calibration illuminant. The matrix is "
Packit 01d647
                   "stored in row scan order. This matrix is stored separately from the "
Packit 01d647
                   "matrix specified by the ColorMatrix1 tag to allow raw converters to "
Packit 01d647
                   "swap in replacement color matrices based on UniqueCameraModel tag, "
Packit 01d647
                   "while still taking advantage of any per-individual camera calibration "
Packit 01d647
                   "performed by the camera manufacturer."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc624, "CameraCalibration2", N_("Camera Calibration 2"),
Packit 01d647
                N_("CameraCalibration2 defines a calibration matrix that transforms "
Packit 01d647
                   "reference camera native space values to individual camera native "
Packit 01d647
                   "space values under the second calibration illuminant. The matrix is "
Packit 01d647
                   "stored in row scan order. This matrix is stored separately from the "
Packit 01d647
                   "matrix specified by the ColorMatrix2 tag to allow raw converters to "
Packit 01d647
                   "swap in replacement color matrices based on UniqueCameraModel tag, "
Packit 01d647
                   "while still taking advantage of any per-individual camera calibration "
Packit 01d647
                   "performed by the camera manufacturer."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc625, "ReductionMatrix1", N_("Reduction Matrix 1"),
Packit 01d647
                N_("ReductionMatrix1 defines a dimensionality reduction matrix for use as "
Packit 01d647
                   "the first stage in converting color camera native space values to XYZ "
Packit 01d647
                   "values, under the first calibration illuminant. This tag may only be "
Packit 01d647
                   "used if ColorPlanes is greater than 3. The matrix is stored in row "
Packit 01d647
                   "scan order."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc626, "ReductionMatrix2", N_("Reduction Matrix 2"),
Packit 01d647
                N_("ReductionMatrix2 defines a dimensionality reduction matrix for use as "
Packit 01d647
                   "the first stage in converting color camera native space values to XYZ "
Packit 01d647
                   "values, under the second calibration illuminant. This tag may only be "
Packit 01d647
                   "used if ColorPlanes is greater than 3. The matrix is stored in row "
Packit 01d647
                   "scan order."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc627, "AnalogBalance", N_("Analog Balance"),
Packit 01d647
                N_("Normally the stored raw values are not white balanced, since any "
Packit 01d647
                   "digital white balancing will reduce the dynamic range of the final "
Packit 01d647
                   "image if the user decides to later adjust the white balance; "
Packit 01d647
                   "however, if camera hardware is capable of white balancing the color "
Packit 01d647
                   "channels before the signal is digitized, it can improve the dynamic "
Packit 01d647
                   "range of the final image. AnalogBalance defines the gain, either "
Packit 01d647
                   "analog (recommended) or digital (not recommended) that has been "
Packit 01d647
                   "applied the stored raw values."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc628, "AsShotNeutral", N_("As Shot Neutral"),
Packit 01d647
                N_("Specifies the selected white balance at time of capture, encoded as "
Packit 01d647
                   "the coordinates of a perfectly neutral color in linear reference "
Packit 01d647
                   "space values. The inclusion of this tag precludes the inclusion of "
Packit 01d647
                   "the AsShotWhiteXY tag."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc629, "AsShotWhiteXY", N_("As Shot White XY"),
Packit 01d647
                N_("Specifies the selected white balance at time of capture, encoded as "
Packit 01d647
                   "x-y chromaticity coordinates. The inclusion of this tag precludes "
Packit 01d647
                   "the inclusion of the AsShotNeutral tag."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62a, "BaselineExposure", N_("Baseline Exposure"),
Packit 01d647
                N_("Camera models vary in the trade-off they make between highlight "
Packit 01d647
                   "headroom and shadow noise. Some leave a significant amount of "
Packit 01d647
                   "highlight headroom during a normal exposure. This allows significant "
Packit 01d647
                   "negative exposure compensation to be applied during raw conversion, "
Packit 01d647
                   "but also means normal exposures will contain more shadow noise. Other "
Packit 01d647
                   "models leave less headroom during normal exposures. This allows for "
Packit 01d647
                   "less negative exposure compensation, but results in lower shadow "
Packit 01d647
                   "noise for normal exposures. Because of these differences, a raw "
Packit 01d647
                   "converter needs to vary the zero point of its exposure compensation "
Packit 01d647
                   "control from model to model. BaselineExposure specifies by how much "
Packit 01d647
                   "(in EV units) to move the zero point. Positive values result in "
Packit 01d647
                   "brighter default results, while negative values result in darker "
Packit 01d647
                   "default results."),
Packit 01d647
                ifd0Id, dngTags, signedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62b, "BaselineNoise", N_("Baseline Noise"),
Packit 01d647
                N_("Specifies the relative noise level of the camera model at a baseline "
Packit 01d647
                   "ISO value of 100, compared to a reference camera model. Since noise "
Packit 01d647
                   "levels tend to vary approximately with the square root of the ISO "
Packit 01d647
                   "value, a raw converter can use this value, combined with the current "
Packit 01d647
                   "ISO, to estimate the relative noise level of the current image."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62c, "BaselineSharpness", N_("Baseline Sharpness"),
Packit 01d647
                N_("Specifies the relative amount of sharpening required for this camera "
Packit 01d647
                   "model, compared to a reference camera model. Camera models vary in "
Packit 01d647
                   "the strengths of their anti-aliasing filters. Cameras with weak or "
Packit 01d647
                   "no filters require less sharpening than cameras with strong "
Packit 01d647
                   "anti-aliasing filters."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62d, "BayerGreenSplit", N_("Bayer Green Split"),
Packit 01d647
                N_("Only applies to CFA images using a Bayer pattern filter array. This "
Packit 01d647
                   "tag specifies, in arbitrary units, how closely the values of the "
Packit 01d647
                   "green pixels in the blue/green rows track the values of the green "
Packit 01d647
                   "pixels in the red/green rows. A value of zero means the two kinds "
Packit 01d647
                   "of green pixels track closely, while a non-zero value means they "
Packit 01d647
                   "sometimes diverge. The useful range for this tag is from 0 (no "
Packit 01d647
                   "divergence) to about 5000 (quite large divergence)."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62e, "LinearResponseLimit", N_("Linear Response Limit"),
Packit 01d647
                N_("Some sensors have an unpredictable non-linearity in their response "
Packit 01d647
                   "as they near the upper limit of their encoding range. This "
Packit 01d647
                   "non-linearity results in color shifts in the highlight areas of the "
Packit 01d647
                   "resulting image unless the raw converter compensates for this effect. "
Packit 01d647
                   "LinearResponseLimit specifies the fraction of the encoding range "
Packit 01d647
                   "above which the response may become significantly non-linear."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc62f, "CameraSerialNumber", N_("Camera Serial Number"),
Packit 01d647
                N_("CameraSerialNumber contains the serial number of the camera or camera "
Packit 01d647
                   "body that captured the image."),
Packit 01d647
                ifd0Id, dngTags, asciiString, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc630, "LensInfo", N_("Lens Info"),
Packit 01d647
                N_("Contains information about the lens that captured the image. If the "
Packit 01d647
                   "minimum f-stops are unknown, they should be encoded as 0/0."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 4, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc631, "ChromaBlurRadius", N_("Chroma Blur Radius"),
Packit 01d647
                N_("ChromaBlurRadius provides a hint to the DNG reader about how much "
Packit 01d647
                   "chroma blur should be applied to the image. If this tag is omitted, "
Packit 01d647
                   "the reader will use its default amount of chroma blurring. "
Packit 01d647
                   "Normally this tag is only included for non-CFA images, since the "
Packit 01d647
                   "amount of chroma blur required for mosaic images is highly dependent "
Packit 01d647
                   "on the de-mosaic algorithm, in which case the DNG reader's default "
Packit 01d647
                   "value is likely optimized for its particular de-mosaic algorithm."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc632, "AntiAliasStrength", N_("Anti Alias Strength"),
Packit 01d647
                N_("Provides a hint to the DNG reader about how strong the camera's "
Packit 01d647
                   "anti-alias filter is. A value of 0.0 means no anti-alias filter "
Packit 01d647
                   "(i.e., the camera is prone to aliasing artifacts with some subjects), "
Packit 01d647
                   "while a value of 1.0 means a strong anti-alias filter (i.e., the "
Packit 01d647
                   "camera almost never has aliasing artifacts)."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc633, "ShadowScale", N_("Shadow Scale"),
Packit 01d647
                N_("This tag is used by Adobe Camera Raw to control the sensitivity of "
Packit 01d647
                   "its 'Shadows' slider."),
Packit 01d647
                ifd0Id, dngTags, signedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc634, "DNGPrivateData", N_("DNG Private Data"),
Packit 01d647
                N_("Provides a way for camera manufacturers to store private data in the "
Packit 01d647
                   "DNG file for use by their own raw converters, and to have that data "
Packit 01d647
                   "preserved by programs that edit DNG files."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc635, "MakerNoteSafety", N_("MakerNote Safety"),
Packit 01d647
                N_("MakerNoteSafety lets the DNG reader know whether the EXIF MakerNote "
Packit 01d647
                   "tag is safe to preserve along with the rest of the EXIF data. File "
Packit 01d647
                   "browsers and other image management software processing an image "
Packit 01d647
                   "with a preserved MakerNote should be aware that any thumbnail "
Packit 01d647
                   "image embedded in the MakerNote may be stale, and may not reflect "
Packit 01d647
                   "the current state of the full size image."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc65a, "CalibrationIlluminant1", N_("Calibration Illuminant 1"),
Packit 01d647
                N_("The illuminant used for the first set of color calibration tags "
Packit 01d647
                   "(ColorMatrix1, CameraCalibration1, ReductionMatrix1). The legal "
Packit 01d647
                   "values for this tag are the same as the legal values for the "
Packit 01d647
                   "LightSource EXIF tag."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc65b, "CalibrationIlluminant2", N_("Calibration Illuminant 2"),
Packit 01d647
                N_("The illuminant used for an optional second set of color calibration "
Packit 01d647
                   "tags (ColorMatrix2, CameraCalibration2, ReductionMatrix2). The legal "
Packit 01d647
                   "values for this tag are the same as the legal values for the "
Packit 01d647
                   "CalibrationIlluminant1 tag; however, if both are included, neither "
Packit 01d647
                   "is allowed to have a value of 0 (unknown)."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc65c, "BestQualityScale", N_("Best Quality Scale"),
Packit 01d647
                N_("For some cameras, the best possible image quality is not achieved "
Packit 01d647
                   "by preserving the total pixel count during conversion. For example, "
Packit 01d647
                   "Fujifilm SuperCCD images have maximum detail when their total pixel "
Packit 01d647
                   "count is doubled. This tag specifies the amount by which the values "
Packit 01d647
                   "of the DefaultScale tag need to be multiplied to achieve the best "
Packit 01d647
                   "quality image size."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc65d, "RawDataUniqueID", N_("Raw Data Unique ID"),
Packit 01d647
                N_("This tag contains a 16-byte unique identifier for the raw image data "
Packit 01d647
                   "in the DNG file. DNG readers can use this tag to recognize a "
Packit 01d647
                   "particular raw image, even if the file's name or the metadata "
Packit 01d647
                   "contained in the file has been changed. If a DNG writer creates such "
Packit 01d647
                   "an identifier, it should do so using an algorithm that will ensure "
Packit 01d647
                   "that it is very unlikely two different images will end up having the "
Packit 01d647
                   "same identifier."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 16, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc68b, "OriginalRawFileName", N_("Original Raw File Name"),
Packit 01d647
                N_("If the DNG file was converted from a non-DNG raw file, then this tag "
Packit 01d647
                   "contains the file name of that original raw file."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc68c, "OriginalRawFileData", N_("Original Raw File Data"),
Packit 01d647
                N_("If the DNG file was converted from a non-DNG raw file, then this tag "
Packit 01d647
                   "contains the compressed contents of that original raw file. The "
Packit 01d647
                   "contents of this tag always use the big-endian byte order. The tag "
Packit 01d647
                   "contains a sequence of data blocks. Future versions of the DNG "
Packit 01d647
                   "specification may define additional data blocks, so DNG readers "
Packit 01d647
                   "should ignore extra bytes when parsing this tag. DNG readers should "
Packit 01d647
                   "also detect the case where data blocks are missing from the end of "
Packit 01d647
                   "the sequence, and should assume a default value for all the missing "
Packit 01d647
                   "blocks. There are no padding or alignment bytes between data blocks."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc68d, "ActiveArea", N_("Active Area"),
Packit 01d647
                N_("This rectangle defines the active (non-masked) pixels of the sensor. "
Packit 01d647
                   "The order of the rectangle coordinates is: top, left, bottom, right."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 4, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc68e, "MaskedAreas", N_("Masked Areas"),
Packit 01d647
                N_("This tag contains a list of non-overlapping rectangle coordinates of "
Packit 01d647
                   "fully masked pixels, which can be optionally used by DNG readers "
Packit 01d647
                   "to measure the black encoding level. The order of each rectangle's "
Packit 01d647
                   "coordinates is: top, left, bottom, right. If the raw image data has "
Packit 01d647
                   "already had its black encoding level subtracted, then this tag should "
Packit 01d647
                   "not be used, since the masked pixels are no longer useful."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc68f, "AsShotICCProfile", N_("As-Shot ICC Profile"),
Packit 01d647
                N_("This tag contains an ICC profile that, in conjunction with the "
Packit 01d647
                   "AsShotPreProfileMatrix tag, provides the camera manufacturer with a "
Packit 01d647
                   "way to specify a default color rendering from camera color space "
Packit 01d647
                   "coordinates (linear reference values) into the ICC profile connection "
Packit 01d647
                   "space. The ICC profile connection space is an output referred "
Packit 01d647
                   "colorimetric space, whereas the other color calibration tags in DNG "
Packit 01d647
                   "specify a conversion into a scene referred colorimetric space. This "
Packit 01d647
                   "means that the rendering in this profile should include any desired "
Packit 01d647
                   "tone and gamut mapping needed to convert between scene referred "
Packit 01d647
                   "values and output referred values."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc690, "AsShotPreProfileMatrix", N_("As-Shot Pre-Profile Matrix"),
Packit 01d647
                N_("This tag is used in conjunction with the AsShotICCProfile tag. It "
Packit 01d647
                   "specifies a matrix that should be applied to the camera color space "
Packit 01d647
                   "coordinates before processing the values through the ICC profile "
Packit 01d647
                   "specified in the AsShotICCProfile tag. The matrix is stored in the "
Packit 01d647
                   "row scan order. If ColorPlanes is greater than three, then this "
Packit 01d647
                   "matrix can (but is not required to) reduce the dimensionality of the "
Packit 01d647
                   "color data down to three components, in which case the AsShotICCProfile "
Packit 01d647
                   "should have three rather than ColorPlanes input components."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc691, "CurrentICCProfile", N_("Current ICC Profile"),
Packit 01d647
                N_("This tag is used in conjunction with the CurrentPreProfileMatrix tag. "
Packit 01d647
                   "The CurrentICCProfile and CurrentPreProfileMatrix tags have the same "
Packit 01d647
                   "purpose and usage as the AsShotICCProfile and AsShotPreProfileMatrix "
Packit 01d647
                   "tag pair, except they are for use by raw file editors rather than "
Packit 01d647
                   "camera manufacturers."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc692, "CurrentPreProfileMatrix", N_("Current Pre-Profile Matrix"),
Packit 01d647
                N_("This tag is used in conjunction with the CurrentICCProfile tag. "
Packit 01d647
                   "The CurrentICCProfile and CurrentPreProfileMatrix tags have the same "
Packit 01d647
                   "purpose and usage as the AsShotICCProfile and AsShotPreProfileMatrix "
Packit 01d647
                   "tag pair, except they are for use by raw file editors rather than "
Packit 01d647
                   "camera manufacturers."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6bf, "ColorimetricReference", N_("Colorimetric Reference"),
Packit 01d647
                N_("The DNG color model documents a transform between camera colors and "
Packit 01d647
                "CIE XYZ values. This tag describes the colorimetric reference for the "
Packit 01d647
                "CIE XYZ values. 0 = The XYZ values are scene-referred. 1 = The XYZ values "
Packit 01d647
                "are output-referred, using the ICC profile perceptual dynamic range. This "
Packit 01d647
                "tag allows output-referred data to be stored in DNG files and still processed "
Packit 01d647
                "correctly by DNG readers."),
Packit 01d647
                ifd0Id, dngTags, unsignedShort, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f3, "CameraCalibrationSignature", N_("Camera Calibration Signature"),
Packit 01d647
                N_("A UTF-8 encoded string associated with the CameraCalibration1 and "
Packit 01d647
                "CameraCalibration2 tags. The CameraCalibration1 and CameraCalibration2 tags "
Packit 01d647
                "should only be used in the DNG color transform if the string stored in the "
Packit 01d647
                "CameraCalibrationSignature tag exactly matches the string stored in the "
Packit 01d647
                "ProfileCalibrationSignature tag for the selected camera profile."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f4, "ProfileCalibrationSignature", N_("Profile Calibration Signature"),
Packit 01d647
                N_("A UTF-8 encoded string associated with the camera profile tags. The "
Packit 01d647
                "CameraCalibration1 and CameraCalibration2 tags should only be used in the "
Packit 01d647
                "DNG color transfer if the string stored in the CameraCalibrationSignature "
Packit 01d647
                "tag exactly matches the string stored in the ProfileCalibrationSignature tag "
Packit 01d647
                "for the selected camera profile."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f6, "AsShotProfileName", N_("As Shot Profile Name"),
Packit 01d647
                N_("A UTF-8 encoded string containing the name of the \"as shot\" camera "
Packit 01d647
                "profile, if any."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f7, "NoiseReductionApplied", N_("Noise Reduction Applied"),
Packit 01d647
                N_("This tag indicates how much noise reduction has been applied to the raw "
Packit 01d647
                "data on a scale of 0.0 to 1.0. A 0.0 value indicates that no noise reduction "
Packit 01d647
                "has been applied. A 1.0 value indicates that the \"ideal\" amount of noise "
Packit 01d647
                "reduction has been applied, i.e. that the DNG reader should not apply "
Packit 01d647
                "additional noise reduction by default. A value of 0/0 indicates that this "
Packit 01d647
                "parameter is unknown."),
Packit 01d647
                ifd0Id, dngTags, unsignedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f8, "ProfileName", N_("Profile Name"),
Packit 01d647
                N_("A UTF-8 encoded string containing the name of the camera profile. This "
Packit 01d647
                "tag is optional if there is only a single camera profile stored in the file "
Packit 01d647
                "but is required for all camera profiles if there is more than one camera "
Packit 01d647
                "profile stored in the file."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6f9, "ProfileHueSatMapDims", N_("Profile Hue Sat Map Dims"),
Packit 01d647
                N_("This tag specifies the number of input samples in each dimension of the "
Packit 01d647
                "hue/saturation/value mapping tables. The data for these tables are stored "
Packit 01d647
                "in ProfileHueSatMapData1 and ProfileHueSatMapData2 tags. The most common "
Packit 01d647
                "case has ValueDivisions equal to 1, so only hue and saturation are used as "
Packit 01d647
                "inputs to the mapping table."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 3, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6fa, "ProfileHueSatMapData1", N_("Profile Hue Sat Map Data 1"),
Packit 01d647
                N_("This tag contains the data for the first hue/saturation/value mapping "
Packit 01d647
                "table. Each entry of the table contains three 32-bit IEEE floating-point "
Packit 01d647
                "values. The first entry is hue shift in degrees; the second entry is "
Packit 01d647
                "saturation scale factor; and the third entry is a value scale factor. The "
Packit 01d647
                "table entries are stored in the tag in nested loop order, with the value "
Packit 01d647
                "divisions in the outer loop, the hue divisions in the middle loop, and the "
Packit 01d647
                "saturation divisions in the inner loop. All zero input saturation entries "
Packit 01d647
                "are required to have a value scale factor of 1.0."),
Packit 01d647
                ifd0Id, dngTags, tiffFloat, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6fb, "ProfileHueSatMapData2", N_("Profile Hue Sat Map Data 2"),
Packit 01d647
                N_("This tag contains the data for the second hue/saturation/value mapping "
Packit 01d647
                "table. Each entry of the table contains three 32-bit IEEE floating-point "
Packit 01d647
                "values. The first entry is hue shift in degrees; the second entry is a "
Packit 01d647
                "saturation scale factor; and the third entry is a value scale factor. The "
Packit 01d647
                "table entries are stored in the tag in nested loop order, with the value "
Packit 01d647
                "divisions in the outer loop, the hue divisions in the middle loop, and the "
Packit 01d647
                "saturation divisions in the inner loop. All zero input saturation entries "
Packit 01d647
                "are required to have a value scale factor of 1.0."),
Packit 01d647
                ifd0Id, dngTags, tiffFloat, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6fc, "ProfileToneCurve", N_("Profile Tone Curve"),
Packit 01d647
                N_("This tag contains a default tone curve that can be applied while "
Packit 01d647
                "processing the image as a starting point for user adjustments. The curve "
Packit 01d647
                "is specified as a list of 32-bit IEEE floating-point value pairs in linear "
Packit 01d647
                "gamma. Each sample has an input value in the range of 0.0 to 1.0, and an "
Packit 01d647
                "output value in the range of 0.0 to 1.0. The first sample is required to be "
Packit 01d647
                "(0.0, 0.0), and the last sample is required to be (1.0, 1.0). Interpolated "
Packit 01d647
                "the curve using a cubic spline."),
Packit 01d647
                ifd0Id, dngTags, tiffFloat, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6fd, "ProfileEmbedPolicy", N_("Profile Embed Policy"),
Packit 01d647
                N_("This tag contains information about the usage rules for the associated "
Packit 01d647
                "camera profile."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc6fe, "ProfileCopyright", N_("Profile Copyright"),
Packit 01d647
                N_("A UTF-8 encoded string containing the copyright information for the "
Packit 01d647
                "camera profile. This string always should be preserved along with the other "
Packit 01d647
                "camera profile tags."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc714, "ForwardMatrix1", N_("Forward Matrix 1"),
Packit 01d647
                N_("This tag defines a matrix that maps white balanced camera colors to XYZ "
Packit 01d647
                "D50 colors."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc715, "ForwardMatrix2", N_("Forward Matrix 2"),
Packit 01d647
                N_("This tag defines a matrix that maps white balanced camera colors to XYZ "
Packit 01d647
                "D50 colors."),
Packit 01d647
                ifd0Id, dngTags, signedRational, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc716, "PreviewApplicationName", N_("Preview Application Name"),
Packit 01d647
                N_("A UTF-8 encoded string containing the name of the application that "
Packit 01d647
                "created the preview stored in the IFD."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc717, "PreviewApplicationVersion", N_("Preview Application Version"),
Packit 01d647
                N_("A UTF-8 encoded string containing the version number of the application "
Packit 01d647
                "that created the preview stored in the IFD."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc718, "PreviewSettingsName", N_("Preview Settings Name"),
Packit 01d647
                N_("A UTF-8 encoded string containing the name of the conversion settings "
Packit 01d647
                "(for example, snapshot name) used for the preview stored in the IFD."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc719, "PreviewSettingsDigest", N_("Preview Settings Digest"),
Packit 01d647
                N_("A unique ID of the conversion settings (for example, MD5 digest) used "
Packit 01d647
                "to render the preview stored in the IFD."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 16, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71a, "PreviewColorSpace", N_("Preview Color Space"),
Packit 01d647
                N_("This tag specifies the color space in which the rendered preview in this "
Packit 01d647
                "IFD is stored. The default value for this tag is sRGB for color previews "
Packit 01d647
                "and Gray Gamma 2.2 for monochrome previews."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71b, "PreviewDateTime", N_("Preview Date Time"),
Packit 01d647
                N_("This tag is an ASCII string containing the name of the date/time at which "
Packit 01d647
                "the preview stored in the IFD was rendered. The date/time is encoded using "
Packit 01d647
                "ISO 8601 format."),
Packit 01d647
                ifd0Id, dngTags, asciiString, 0, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71c, "RawImageDigest", N_("Raw Image Digest"),
Packit 01d647
                N_("This tag is an MD5 digest of the raw image data. All pixels in the image "
Packit 01d647
                "are processed in row-scan order. Each pixel is zero padded to 16 or 32 bits "
Packit 01d647
                "deep (16-bit for data less than or equal to 16 bits deep, 32-bit otherwise). "
Packit 01d647
                "The data for each pixel is processed in little-endian byte order."),
Packit 01d647
                ifd0Id, dngTags, undefined, 16, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71d, "OriginalRawFileDigest", N_("Original Raw File Digest"),
Packit 01d647
                N_("This tag is an MD5 digest of the data stored in the OriginalRawFileData "
Packit 01d647
                "tag."),
Packit 01d647
                ifd0Id, dngTags, undefined, 16, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71e, "SubTileBlockSize", N_("Sub Tile Block Size"),
Packit 01d647
                N_("Normally, the pixels within a tile are stored in simple row-scan order. "
Packit 01d647
                "This tag specifies that the pixels within a tile should be grouped first "
Packit 01d647
                "into rectangular blocks of the specified size. These blocks are stored in "
Packit 01d647
                "row-scan order. Within each block, the pixels are stored in row-scan order. "
Packit 01d647
                "The use of a non-default value for this tag requires setting the "
Packit 01d647
                "DNGBackwardVersion tag to at least 1.2.0.0."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 2, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc71f, "RowInterleaveFactor", N_("Row Interleave Factor"),
Packit 01d647
                N_("This tag specifies that rows of the image are stored in interleaved "
Packit 01d647
                "order. The value of the tag specifies the number of interleaved fields. "
Packit 01d647
                "The use of a non-default value for this tag requires setting the "
Packit 01d647
                "DNGBackwardVersion tag to at least 1.2.0.0."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc725, "ProfileLookTableDims", N_("Profile Look Table Dims"),
Packit 01d647
                N_("This tag specifies the number of input samples in each dimension of a "
Packit 01d647
                "default \"look\" table. The data for this table is stored in the "
Packit 01d647
                "ProfileLookTableData tag."),
Packit 01d647
                ifd0Id, dngTags, unsignedLong, 3, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc726, "ProfileLookTableData", N_("Profile Look Table Data"),
Packit 01d647
                N_("This tag contains a default \"look\" table that can be applied while "
Packit 01d647
                "processing the image as a starting point for user adjustment. This table "
Packit 01d647
                "uses the same format as the tables stored in the ProfileHueSatMapData1 "
Packit 01d647
                "and ProfileHueSatMapData2 tags, and is applied in the same color space. "
Packit 01d647
                "However, it should be applied later in the processing pipe, after any "
Packit 01d647
                "exposure compensation and/or fill light stages, but before any tone curve "
Packit 01d647
                "stage. Each entry of the table contains three 32-bit IEEE floating-point "
Packit 01d647
                "values. The first entry is hue shift in degrees, the second entry is a "
Packit 01d647
                "saturation scale factor, and the third entry is a value scale factor. "
Packit 01d647
                "The table entries are stored in the tag in nested loop order, with the "
Packit 01d647
                "value divisions in the outer loop, the hue divisions in the middle loop, "
Packit 01d647
                "and the saturation divisions in the inner loop. All zero input saturation "
Packit 01d647
                "entries are required to have a value scale factor of 1.0."),
Packit 01d647
                ifd0Id, dngTags, tiffFloat, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc740, "OpcodeList1", N_("Opcode List 1"),
Packit 01d647
                N_("Specifies the list of opcodes that should be applied to the raw image, "
Packit 01d647
                "as read directly from the file."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc741, "OpcodeList2", N_("Opcode List 2"),
Packit 01d647
                N_("Specifies the list of opcodes that should be applied to the raw image, "
Packit 01d647
                "just after it has been mapped to linear reference values."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc74e, "OpcodeList3", N_("Opcode List 3"),
Packit 01d647
                N_("Specifies the list of opcodes that should be applied to the raw image, "
Packit 01d647
                "just after it has been demosaiced."),
Packit 01d647
                ifd0Id, dngTags, undefined, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc761, "NoiseProfile", N_("Noise Profile"),
Packit 01d647
                N_("NoiseProfile describes the amount of noise in a raw image. Specifically, "
Packit 01d647
                "this tag models the amount of signal-dependent photon (shot) noise and "
Packit 01d647
                "signal-independent sensor readout noise, two common sources of noise in "
Packit 01d647
                "raw images. The model assumes that the noise is white and spatially "
Packit 01d647
                "independent, ignoring fixed pattern effects and other sources of noise (e.g., "
Packit 01d647
                "pixel response non-uniformity, spatially-dependent thermal effects, etc.)."),
Packit 01d647
                ifd0Id, dngTags, tiffDouble, -1, printValue), // DNG tag
Packit 01d647
Packit 01d647
        ////////////////////////////////////////
Packit 01d647
        // http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf
Packit 01d647
        TagInfo(0xc763, "TimeCodes", N_("TimeCodes"),
Packit 01d647
                N_("The optional TimeCodes tag shall contain an ordered array of time codes. "
Packit 01d647
                "All time codes shall be 8 bytes long and in binary format. The tag may "
Packit 01d647
                "contain from 1 to 10 time codes. When the tag contains more than one time "
Packit 01d647
                "code, the first one shall be the default time code. This specification "
Packit 01d647
                "does not prescribe how to use multiple time codes. "
Packit 01d647
                "Each time code shall be as defined for the 8-byte time code structure in "
Packit 01d647
                "SMPTE 331M-2004, Section 8.3. See also SMPTE 12-1-2008 and SMPTE 309-1999."),
Packit 01d647
                ifd0Id, dngTags, unsignedByte, 8, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc764, "FrameRate", N_("FrameRate"),
Packit 01d647
                N_("The optional FrameRate tag shall specify the video frame "
Packit 01d647
                   "rate in number of image frames per second, expressed as a "
Packit 01d647
                   "signed rational number. The numerator shall be non-negative "
Packit 01d647
                   "and the denominator shall be positive. This field value is "
Packit 01d647
                   "identical to the sample rate field in SMPTE 377-1-2009."),
Packit 01d647
                ifd0Id, dngTags, signedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc772, "TStop", N_("TStop"),
Packit 01d647
                N_("The optional TStop tag shall specify the T-stop of the "
Packit 01d647
                "actual lens, expressed as an unsigned rational number. "
Packit 01d647
                "T-stop is also known as T-number or the photometric "
Packit 01d647
                "aperture of the lens. (F-number is the geometric aperture "
Packit 01d647
                "of the lens.) When the exact value is known, the T-stop "
Packit 01d647
                "shall be specified using a single number. Alternately, "
Packit 01d647
                "two numbers shall be used to indicate a T-stop range, "
Packit 01d647
                "in which case the first number shall be the minimum "
Packit 01d647
                "T-stop and the second number shall be the maximum T-stop."),
Packit 01d647
                ifd0Id, dngTags, signedRational, 1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc789, "ReelName", N_("ReelName"),
Packit 01d647
                N_("The optional ReelName tag shall specify a name for a "
Packit 01d647
                "sequence of images, where each image in the sequence has "
Packit 01d647
                "a unique image identifier (including but not limited to file "
Packit 01d647
                "name, frame number, date time, time code)."),
Packit 01d647
                ifd0Id, dngTags, asciiString, -1, printValue), // DNG tag
Packit 01d647
        TagInfo(0xc7a1, "CameraLabel", N_("CameraLabel"),
Packit 01d647
                N_("The optional CameraLabel tag shall specify a text label "
Packit 01d647
                "for how the camera is used or assigned in this clip. "
Packit 01d647
                "This tag is similar to CameraLabel in XMP."),
Packit 01d647
                ifd0Id, dngTags, asciiString, -1, printValue), // DNG tag
Packit 01d647
Packit 01d647
        ////////////////////////////////////////
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownIfdTag)", N_("Unknown IFD tag"),
Packit 01d647
                N_("Unknown IFD tag"),
Packit 01d647
                ifd0Id, sectionIdNotSet, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
    const TagInfo* ifdTagList()
Packit 01d647
    {
Packit 01d647
        return ifdTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // Exif IFD Tags
Packit 01d647
    static const TagInfo exifTagInfo[] = {
Packit 01d647
        TagInfo(0x829a, "ExposureTime", N_("Exposure Time"),
Packit 01d647
                N_("Exposure time, given in seconds (sec)."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x829a),
Packit 01d647
        TagInfo(0x829d, "FNumber", N_("FNumber"),
Packit 01d647
                N_("The F number."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x829d),
Packit 01d647
        TagInfo(0x8822, "ExposureProgram", N_("Exposure Program"),
Packit 01d647
                N_("The class of the program used by the camera to set exposure "
Packit 01d647
                "when the picture is taken."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0x8822),
Packit 01d647
        TagInfo(0x8824, "SpectralSensitivity", N_("Spectral Sensitivity"),
Packit 01d647
                N_("Indicates the spectral sensitivity of each channel of the "
Packit 01d647
                "camera used. The tag value is an ASCII string compatible "
Packit 01d647
                "with the standard developed by the ASTM Technical Committee."),
Packit 01d647
                exifId, captureCond, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x8827, "ISOSpeedRatings", N_("ISO Speed Ratings"),
Packit 01d647
                N_("Indicates the ISO Speed and ISO Latitude of the camera or "
Packit 01d647
                "input device as specified in ISO 12232."),
Packit 01d647
                exifId, captureCond, unsignedShort, 0, print0x8827),
Packit 01d647
        TagInfo(0x8828, "OECF", N_("Opto-Electoric Conversion Function"),
Packit 01d647
                N_("Indicates the Opto-Electoric Conversion Function (OECF) "
Packit 01d647
                "specified in ISO 14524. <OECF> is the relationship between "
Packit 01d647
                "the camera optical input and the image values."),
Packit 01d647
                exifId, captureCond, undefined, 0, printValue),
Packit 01d647
        TagInfo(0x8830, "SensitivityType", N_("Sensitivity Type"),
Packit 01d647
                N_("The SensitivityType tag indicates which one of the parameters of "
Packit 01d647
                "ISO12232 is the PhotographicSensitivity tag. Although it is an optional tag, "
Packit 01d647
                "it should be recorded when a PhotographicSensitivity tag is recorded. "
Packit 01d647
                "Value = 4, 5, 6, or 7 may be used in case that the values of plural "
Packit 01d647
                "parameters are the same."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, printValue),
Packit 01d647
        TagInfo(0x8831, "StandardOutputSensitivity", N_("Standard Output Sensitivity"),
Packit 01d647
                N_("This tag indicates the standard output sensitivity value of a camera or "
Packit 01d647
                "input device defined in ISO 12232. When recording this tag, the "
Packit 01d647
                "PhotographicSensitivity and SensitivityType tags shall also be recorded."),
Packit 01d647
                exifId, captureCond, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8832, "RecommendedExposureIndex", N_("Recommended Exposure Index"),
Packit 01d647
                N_("This tag indicates the recommended exposure index value of a camera or "
Packit 01d647
                "input device defined in ISO 12232. When recording this tag, the "
Packit 01d647
                "PhotographicSensitivity and SensitivityType tags shall also be recorded."),
Packit 01d647
                exifId, captureCond, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8833, "ISOSpeed", N_("ISO Speed"),
Packit 01d647
                N_("This tag indicates the ISO speed value of a camera or input device that "
Packit 01d647
                "is defined in ISO 12232. When recording this tag, the PhotographicSensitivity "
Packit 01d647
                "and SensitivityType tags shall also be recorded."),
Packit 01d647
                exifId, captureCond, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8834, "ISOSpeedLatitudeyyy", N_("ISO Speed Latitude yyy"),
Packit 01d647
                N_("This tag indicates the ISO speed latitude yyy value of a camera or input "
Packit 01d647
                "device that is defined in ISO 12232. However, this tag shall not be recorded "
Packit 01d647
                "without ISOSpeed and ISOSpeedLatitudezzz."),
Packit 01d647
                exifId, captureCond, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x8835, "ISOSpeedLatitudezzz", N_("ISO Speed Latitude zzz"),
Packit 01d647
                N_("This tag indicates the ISO speed latitude zzz value of a camera or input "
Packit 01d647
                "device that is defined in ISO 12232. However, this tag shall not be recorded "
Packit 01d647
                "without ISOSpeed and ISOSpeedLatitudeyyy."),
Packit 01d647
                exifId, captureCond, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x9000, "ExifVersion", N_("Exif Version"),
Packit 01d647
                N_("The version of this standard supported. Nonexistence of this "
Packit 01d647
                "field is taken to mean nonconformance to the standard."),
Packit 01d647
                exifId, exifVersion, undefined, 4, printExifVersion),
Packit 01d647
        TagInfo(0x9003, "DateTimeOriginal", N_("Date and Time (original)"),
Packit 01d647
                N_("The date and time when the original image data was generated. "
Packit 01d647
                "For a digital still camera the date and time the picture was taken are recorded."),
Packit 01d647
                exifId, dateTime, asciiString, 20, printValue),
Packit 01d647
        TagInfo(0x9004, "DateTimeDigitized", N_("Date and Time (digitized)"),
Packit 01d647
                N_("The date and time when the image was stored as digital data."),
Packit 01d647
                exifId, dateTime, asciiString, 20, printValue),
Packit 01d647
        TagInfo(0x9101, "ComponentsConfiguration", N_("Components Configuration"),
Packit 01d647
                N_("Information specific to compressed data. The channels of "
Packit 01d647
                "each component are arranged in order from the 1st "
Packit 01d647
                "component to the 4th. For uncompressed data the data "
Packit 01d647
                "arrangement is given in the <PhotometricInterpretation> tag. "
Packit 01d647
                "However, since <PhotometricInterpretation> can only "
Packit 01d647
                "express the order of Y, Cb and Cr, this tag is provided "
Packit 01d647
                "for cases when compressed data uses components other than "
Packit 01d647
                "Y, Cb, and Cr and to enable support of other sequences."),
Packit 01d647
                exifId, imgConfig, undefined, 4, print0x9101),
Packit 01d647
        TagInfo(0x9102, "CompressedBitsPerPixel", N_("Compressed Bits per Pixel"),
Packit 01d647
                N_("Information specific to compressed data. The compression mode "
Packit 01d647
                "used for a compressed image is indicated in unit bits per pixel."),
Packit 01d647
                exifId, imgConfig, unsignedRational, 1, printFloat),
Packit 01d647
        TagInfo(0x9201, "ShutterSpeedValue", N_("Shutter speed"),
Packit 01d647
                N_("Shutter speed. The unit is the APEX (Additive System of "
Packit 01d647
                "Photographic Exposure) setting."),
Packit 01d647
                exifId, captureCond, signedRational, 1, print0x9201),
Packit 01d647
        TagInfo(0x9202, "ApertureValue", N_("Aperture"),
Packit 01d647
                N_("The lens aperture. The unit is the APEX value."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x9202),
Packit 01d647
        TagInfo(0x9203, "BrightnessValue", N_("Brightness"),
Packit 01d647
                N_("The value of brightness. The unit is the APEX value. "
Packit 01d647
                "Ordinarily it is given in the range of -99.99 to 99.99."),
Packit 01d647
                exifId, captureCond, signedRational, 1, printFloat),
Packit 01d647
        TagInfo(0x9204, "ExposureBiasValue", N_("Exposure Bias"),
Packit 01d647
                N_("The exposure bias. The units is the APEX value. Ordinarily "
Packit 01d647
                "it is given in the range of -99.99 to 99.99."),
Packit 01d647
                exifId, captureCond, signedRational, 1, print0x9204),
Packit 01d647
        TagInfo(0x9205, "MaxApertureValue", N_("Max Aperture Value"),
Packit 01d647
                N_("The smallest F number of the lens. The unit is the APEX value. "
Packit 01d647
                "Ordinarily it is given in the range of 00.00 to 99.99, "
Packit 01d647
                "but it is not limited to this range."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x9202),
Packit 01d647
        TagInfo(0x9206, "SubjectDistance", N_("Subject Distance"),
Packit 01d647
                N_("The distance to the subject, given in meters."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x9206),
Packit 01d647
        TagInfo(0x9207, "MeteringMode", N_("Metering Mode"),
Packit 01d647
                N_("The metering mode."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0x9207),
Packit 01d647
        TagInfo(0x9208, "LightSource", N_("Light Source"),
Packit 01d647
                N_("The kind of light source."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0x9208),
Packit 01d647
        TagInfo(0x9209, "Flash", N_("Flash"),
Packit 01d647
                N_("This tag is recorded when an image is taken using a strobe light (flash)."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, EXV_PRINT_TAG(exifFlash)),
Packit 01d647
        TagInfo(0x920a, "FocalLength", N_("Focal Length"),
Packit 01d647
                N_("The actual focal length of the lens, in mm. Conversion is not "
Packit 01d647
                "made to the focal length of a 35 mm film camera."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0x920a),
Packit 01d647
        TagInfo(0x9214, "SubjectArea", N_("Subject Area"),
Packit 01d647
                N_("This tag indicates the location and area of the main subject "
Packit 01d647
                "in the overall scene."),
Packit 01d647
                exifId, captureCond, unsignedShort, -1, printValue),
Packit 01d647
        TagInfo(0x927c, "MakerNote", N_("Maker Note"),
Packit 01d647
                N_("A tag for manufacturers of Exif writers to record any desired "
Packit 01d647
                "information. The contents are up to the manufacturer."),
Packit 01d647
                exifId, userInfo, undefined, 0, printValue),
Packit 01d647
        TagInfo(0x9286, "UserComment", N_("User Comment"),
Packit 01d647
                N_("A tag for Exif users to write keywords or comments on the image "
Packit 01d647
                "besides those in <ImageDescription>, and without the "
Packit 01d647
                "character code limitations of the <ImageDescription> tag."),
Packit Service fb147c
                exifId, userInfo, comment, 0, printValue),
Packit 01d647
        TagInfo(0x9290, "SubSecTime", N_("Sub-seconds Time"),
Packit 01d647
                N_("A tag used to record fractions of seconds for the <DateTime> tag."),
Packit 01d647
                exifId, dateTime, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x9291, "SubSecTimeOriginal", N_("Sub-seconds Time Original"),
Packit 01d647
                N_("A tag used to record fractions of seconds for the <DateTimeOriginal> tag."),
Packit 01d647
                exifId, dateTime, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x9292, "SubSecTimeDigitized", N_("Sub-seconds Time Digitized"),
Packit 01d647
                N_("A tag used to record fractions of seconds for the <DateTimeDigitized> tag."),
Packit 01d647
                exifId, dateTime, asciiString, 0, printValue),
Packit Service fb147c
        TagInfo(0x9400, "AmbientTemperature", N_("AmbientTemperature"),
Packit Service fb147c
                N_("AmbientTemperature"),
Packit Service fb147c
                exifId, captureCond, signedRational, 0, printValue),
Packit 01d647
        TagInfo(0xa000, "FlashpixVersion", N_("FlashPix Version"),
Packit 01d647
                N_("The FlashPix format version supported by a FPXR file."),
Packit 01d647
                exifId, exifVersion, undefined, 4, printExifVersion),
Packit 01d647
        TagInfo(0xa001, "ColorSpace", N_("Color Space"),
Packit 01d647
                N_("The color space information tag is always "
Packit 01d647
                "recorded as the color space specifier. Normally sRGB "
Packit 01d647
                "is used to define the color space based on the PC monitor "
Packit 01d647
                "conditions and environment. If a color space other than "
Packit 01d647
                "sRGB is used, Uncalibrated is set. Image data "
Packit 01d647
                "recorded as Uncalibrated can be treated as sRGB when it is "
Packit 01d647
                "converted to FlashPix."),
Packit 01d647
                exifId, imgCharacter, unsignedShort, 1, print0xa001),
Packit 01d647
        TagInfo(0xa002, "PixelXDimension", N_("Pixel X Dimension"),
Packit 01d647
                N_("Information specific to compressed data. When a "
Packit 01d647
                "compressed file is recorded, the valid width of the "
Packit 01d647
                "meaningful image must be recorded in this tag, whether or "
Packit 01d647
                "not there is padding data or a restart marker. This tag "
Packit 01d647
                "should not exist in an uncompressed file."),
Packit 01d647
                exifId, imgConfig, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xa003, "PixelYDimension", N_("Pixel Y Dimension"),
Packit 01d647
                N_("Information specific to compressed data. When a compressed "
Packit 01d647
                "file is recorded, the valid height of the meaningful image "
Packit 01d647
                "must be recorded in this tag, whether or not there is padding "
Packit 01d647
                "data or a restart marker. This tag should not exist in an "
Packit 01d647
                "uncompressed file. Since data padding is unnecessary in the vertical "
Packit 01d647
                "direction, the number of lines recorded in this valid image height tag "
Packit 01d647
                "will in fact be the same as that recorded in the SOF."),
Packit 01d647
                exifId, imgConfig, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xa004, "RelatedSoundFile", N_("Related Sound File"),
Packit 01d647
                N_("This tag is used to record the name of an audio file related "
Packit 01d647
                "to the image data. The only relational information "
Packit 01d647
                "recorded here is the Exif audio file name and extension (an "
Packit 01d647
                "ASCII string consisting of 8 characters + '.' + 3 "
Packit 01d647
                "characters). The path is not recorded."),
Packit 01d647
                exifId, relatedFile, asciiString, 13, printValue),
Packit 01d647
        TagInfo(0xa005, "InteroperabilityTag", N_("Interoperability IFD Pointer"),
Packit 01d647
                N_("Interoperability IFD is composed of tags which stores the "
Packit 01d647
                "information to ensure the Interoperability and pointed "
Packit 01d647
                "by the following tag located in Exif IFD. "
Packit 01d647
                "The Interoperability structure of Interoperability IFD is "
Packit 01d647
                "the same as TIFF defined IFD structure but does not contain the "
Packit 01d647
                "image data characteristically compared with normal TIFF IFD."),
Packit 01d647
                exifId, exifFormat, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xa20b, "FlashEnergy", N_("Flash Energy"),
Packit 01d647
                N_("Indicates the strobe energy at the time the image is "
Packit 01d647
                "captured, as measured in Beam Candle Power Seconds (BCPS)."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0xa20c, "SpatialFrequencyResponse", N_("Spatial Frequency Response"),
Packit 01d647
                N_("This tag records the camera or input device spatial frequency "
Packit 01d647
                "table and SFR values in the direction of image width, "
Packit 01d647
                "image height, and diagonal direction, as specified in ISO 12233."),
Packit 01d647
                exifId, captureCond, undefined, 0, printValue),
Packit 01d647
        TagInfo(0xa20e, "FocalPlaneXResolution", N_("Focal Plane X-Resolution"),
Packit 01d647
                N_("Indicates the number of pixels in the image width (X) direction "
Packit 01d647
                "per <FocalPlaneResolutionUnit> on the camera focal plane."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, printFloat),
Packit 01d647
        TagInfo(0xa20f, "FocalPlaneYResolution", N_("Focal Plane Y-Resolution"),
Packit 01d647
                N_("Indicates the number of pixels in the image height (V) direction "
Packit 01d647
                "per <FocalPlaneResolutionUnit> on the camera focal plane."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, printFloat),
Packit 01d647
        TagInfo(0xa210, "FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"),
Packit 01d647
                N_("Indicates the unit for measuring <FocalPlaneXResolution> and "
Packit 01d647
                "<FocalPlaneYResolution>. This value is the same as the <ResolutionUnit>."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, printExifUnit),
Packit 01d647
        TagInfo(0xa214, "SubjectLocation", N_("Subject Location"),
Packit 01d647
                N_("Indicates the location of the main subject in the scene. The "
Packit 01d647
                "value of this tag represents the pixel at the center of the "
Packit 01d647
                "main subject relative to the left edge, prior to rotation "
Packit 01d647
                "processing as per the <Rotation> tag. The first value "
Packit 01d647
                "indicates the X column number and second indicates the Y row number."),
Packit 01d647
                exifId, captureCond, unsignedShort, 2, printValue),
Packit 01d647
        TagInfo(0xa215, "ExposureIndex", N_("Exposure index"),
Packit 01d647
                N_("Indicates the exposure index selected on the camera or "
Packit 01d647
                "input device at the time the image is captured."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0xa217, "SensingMethod", N_("Sensing Method"),
Packit 01d647
                N_("Indicates the image sensor type on the camera or input device."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa217),
Packit 01d647
        TagInfo(0xa300, "FileSource", N_("File Source"),
Packit 01d647
                N_("Indicates the image source. If a DSC recorded the image, "
Packit 01d647
                "this tag value of this tag always be set to 3, indicating "
Packit 01d647
                "that the image was recorded on a DSC."),
Packit 01d647
                exifId, captureCond, undefined, 1, print0xa300),
Packit 01d647
        TagInfo(0xa301, "SceneType", N_("Scene Type"),
Packit 01d647
                N_("Indicates the type of scene. If a DSC recorded the image, "
Packit 01d647
                "this tag value must always be set to 1, indicating that the "
Packit 01d647
                "image was directly photographed."),
Packit 01d647
                exifId, captureCond, undefined, 1, print0xa301),
Packit 01d647
        TagInfo(0xa302, "CFAPattern", N_("Color Filter Array Pattern"),
Packit 01d647
                N_("Indicates the color filter array (CFA) geometric pattern of the "
Packit 01d647
                "image sensor when a one-chip color area sensor is used. "
Packit 01d647
                "It does not apply to all sensing methods."),
Packit 01d647
                exifId, captureCond, undefined, 0, printValue),
Packit 01d647
        TagInfo(0xa401, "CustomRendered", N_("Custom Rendered"),
Packit 01d647
                N_("This tag indicates the use of special processing on image "
Packit 01d647
                "data, such as rendering geared to output. When special "
Packit 01d647
                "processing is performed, the reader is expected to disable "
Packit 01d647
                "or minimize any further processing."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa401),
Packit 01d647
        TagInfo(0xa402, "ExposureMode", N_("Exposure Mode"),
Packit 01d647
                N_("This tag indicates the exposure mode set when the image was "
Packit 01d647
                "shot. In auto-bracketing mode, the camera shoots a series of "
Packit 01d647
                "frames of the same scene at different exposure settings."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa402),
Packit 01d647
        TagInfo(0xa403, "WhiteBalance", N_("White Balance"),
Packit 01d647
                N_("This tag indicates the white balance mode set when the image was shot."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa403),
Packit 01d647
        TagInfo(0xa404, "DigitalZoomRatio", N_("Digital Zoom Ratio"),
Packit 01d647
                N_("This tag indicates the digital zoom ratio when the image was "
Packit 01d647
                "shot. If the numerator of the recorded value is 0, this "
Packit 01d647
                "indicates that digital zoom was not used."),
Packit 01d647
                exifId, captureCond, unsignedRational, 1, print0xa404),
Packit 01d647
        TagInfo(0xa405, "FocalLengthIn35mmFilm", N_("Focal Length In 35mm Film"),
Packit 01d647
                N_("This tag indicates the equivalent focal length assuming a "
Packit 01d647
                "35mm film camera, in mm. A value of 0 means the focal "
Packit 01d647
                "length is unknown. Note that this tag differs from the "
Packit 01d647
                "<FocalLength> tag."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa405),
Packit 01d647
        TagInfo(0xa406, "SceneCaptureType", N_("Scene Capture Type"),
Packit 01d647
                N_("This tag indicates the type of scene that was shot. It can "
Packit 01d647
                "also be used to record the mode in which the image was "
Packit 01d647
                "shot. Note that this differs from the <SceneType> tag."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa406),
Packit 01d647
        TagInfo(0xa407, "GainControl", N_("Gain Control"),
Packit 01d647
                N_("This tag indicates the degree of overall image gain adjustment."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa407),
Packit 01d647
        TagInfo(0xa408, "Contrast", N_("Contrast"),
Packit 01d647
                N_("This tag indicates the direction of contrast processing "
Packit 01d647
                "applied by the camera when the image was shot."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, printNormalSoftHard),
Packit 01d647
        TagInfo(0xa409, "Saturation", N_("Saturation"),
Packit 01d647
                N_("This tag indicates the direction of saturation processing "
Packit 01d647
                "applied by the camera when the image was shot."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa409),
Packit 01d647
        TagInfo(0xa40a, "Sharpness", N_("Sharpness"),
Packit 01d647
                N_("This tag indicates the direction of sharpness processing "
Packit 01d647
                "applied by the camera when the image was shot."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, printNormalSoftHard),
Packit 01d647
        TagInfo(0xa40b, "DeviceSettingDescription", N_("Device Setting Description"),
Packit 01d647
                N_("This tag indicates information on the picture-taking "
Packit 01d647
                "conditions of a particular camera model. The tag is used "
Packit 01d647
                "only to indicate the picture-taking conditions in the reader."),
Packit 01d647
                exifId, captureCond, undefined, 0, printValue),
Packit 01d647
        TagInfo(0xa40c, "SubjectDistanceRange", N_("Subject Distance Range"),
Packit 01d647
                N_("This tag indicates the distance to the subject."),
Packit 01d647
                exifId, captureCond, unsignedShort, 1, print0xa40c),
Packit 01d647
        TagInfo(0xa420, "ImageUniqueID", N_("Image Unique ID"),
Packit 01d647
                N_("This tag indicates an identifier assigned uniquely to "
Packit 01d647
                "each image. It is recorded as an ASCII string equivalent "
Packit 01d647
                "to hexadecimal notation and 128-bit fixed length."),
Packit 01d647
                exifId, otherTags, asciiString, 33, printValue),
Packit 01d647
        TagInfo(0xa430, "CameraOwnerName", N_("Camera Owner Name"),
Packit 01d647
                N_("This tag records the owner of a camera used in "
Packit 01d647
                "photography as an ASCII string."),
Packit 01d647
                exifId, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0xa431, "BodySerialNumber", N_("Body Serial Number"),
Packit 01d647
                N_("This tag records the serial number of the body of the camera "
Packit 01d647
                "that was used in photography as an ASCII string."),
Packit 01d647
                exifId, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0xa432, "LensSpecification", N_("Lens Specification"),
Packit 01d647
                N_("This tag notes minimum focal length, maximum focal length, "
Packit 01d647
                "minimum F number in the minimum focal length, and minimum F number "
Packit 01d647
                "in the maximum focal length, which are specification information "
Packit 01d647
                "for the lens that was used in photography. When the minimum F "
Packit 01d647
                "number is unknown, the notation is 0/0"),
Packit 01d647
                exifId, otherTags, unsignedRational, 4, printValue),
Packit 01d647
        TagInfo(0xa433, "LensMake", N_("Lens Make"),
Packit 01d647
                N_("This tag records the lens manufactor as an ASCII string."),
Packit 01d647
                exifId, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0xa434, "LensModel", N_("Lens Model"),
Packit 01d647
                N_("This tag records the lens's model name and model number as an "
Packit 01d647
                "ASCII string."),
Packit 01d647
                exifId, otherTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0xa435, "LensSerialNumber", N_("Lens Serial Number"),
Packit 01d647
                N_("This tag records the serial number of the interchangeable lens "
Packit 01d647
                "that was used in photography as an ASCII string."),
Packit 01d647
                exifId, otherTags, asciiString, 0, printValue),
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownExifTag)", N_("Unknown Exif tag"),
Packit 01d647
                N_("Unknown Exif tag"),
Packit 01d647
                exifId, sectionIdNotSet, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
    const TagInfo* exifTagList()
Packit 01d647
    {
Packit 01d647
        return exifTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! GPS latitude reference, tag 0x0001; also GPSDestLatitudeRef, tag 0x0013
Packit 01d647
    extern const TagDetails exifGPSLatitudeRef[] = {
Packit 01d647
        { 78, N_("North") },
Packit 01d647
        { 83, N_("South") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    //! GPS longitude reference, tag 0x0003; also GPSDestLongitudeRef, tag 0x0015
Packit 01d647
    extern const TagDetails exifGPSLongitudeRef[] = {
Packit 01d647
        { 69, N_("East") },
Packit 01d647
        { 87, N_("West") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    // GPS Info Tags
Packit 01d647
    static const TagInfo gpsTagInfo[] = {
Packit 01d647
        TagInfo(0x0000, "GPSVersionID", N_("GPS Version ID"),
Packit 01d647
                N_("Indicates the version of <GPSInfoIFD>. The version is given "
Packit 01d647
                "as 2.0.0.0. This tag is mandatory when <GPSInfo> tag is "
Packit 01d647
                "present. (Note: The <GPSVersionID> tag is given in bytes, "
Packit 01d647
                "unlike the <ExifVersion> tag. When the version is "
Packit 01d647
                "2.0.0.0, the tag value is 02000000.H)."),
Packit 01d647
                gpsId, gpsTags, unsignedByte, 4, print0x0000),
Packit 01d647
        TagInfo(0x0001, "GPSLatitudeRef", N_("GPS Latitude Reference"),
Packit 01d647
                N_("Indicates whether the latitude is north or south latitude. The "
Packit 01d647
                "ASCII value 'N' indicates north latitude, and 'S' is south latitude."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)),
Packit 01d647
        TagInfo(0x0002, "GPSLatitude", N_("GPS Latitude"),
Packit 01d647
                N_("Indicates the latitude. The latitude is expressed as three "
Packit 01d647
                "RATIONAL values giving the degrees, minutes, and seconds, "
Packit 01d647
                "respectively. When degrees, minutes and seconds are expressed, "
Packit 01d647
                "the format is dd/1,mm/1,ss/1. When degrees and minutes are used "
Packit 01d647
                "and, for example, fractions of minutes are given up to two "
Packit 01d647
                "decimal places, the format is dd/1,mmmm/100,0/1."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 3, printDegrees),
Packit 01d647
        TagInfo(0x0003, "GPSLongitudeRef", N_("GPS Longitude Reference"),
Packit 01d647
                N_("Indicates whether the longitude is east or west longitude. "
Packit 01d647
                "ASCII 'E' indicates east longitude, and 'W' is west longitude."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)),
Packit 01d647
        TagInfo(0x0004, "GPSLongitude", N_("GPS Longitude"),
Packit 01d647
                N_("Indicates the longitude. The longitude is expressed as three "
Packit 01d647
                "RATIONAL values giving the degrees, minutes, and seconds, "
Packit 01d647
                "respectively. When degrees, minutes and seconds are expressed, "
Packit 01d647
                "the format is ddd/1,mm/1,ss/1. When degrees and minutes are "
Packit 01d647
                "used and, for example, fractions of minutes are given up to "
Packit 01d647
                "two decimal places, the format is ddd/1,mmmm/100,0/1."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 3, printDegrees),
Packit 01d647
        TagInfo(0x0005, "GPSAltitudeRef", N_("GPS Altitude Reference"),
Packit 01d647
                N_("Indicates the altitude used as the reference altitude. If the "
Packit 01d647
                "reference is sea level and the altitude is above sea level, 0 "
Packit 01d647
                "is given. If the altitude is below sea level, a value of 1 is given "
Packit 01d647
                "and the altitude is indicated as an absolute value in the "
Packit 01d647
                "GSPAltitude tag. The reference unit is meters. Note that this tag "
Packit 01d647
                "is BYTE type, unlike other reference tags."),
Packit 01d647
                gpsId, gpsTags, unsignedByte, 1, print0x0005),
Packit 01d647
        TagInfo(0x0006, "GPSAltitude", N_("GPS Altitude"),
Packit 01d647
                N_("Indicates the altitude based on the reference in GPSAltitudeRef. "
Packit 01d647
                "Altitude is expressed as one RATIONAL value. The reference unit is meters."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, print0x0006),
Packit 01d647
        TagInfo(0x0007, "GPSTimeStamp", N_("GPS Time Stamp"),
Packit 01d647
                N_("Indicates the time as UTC (Coordinated Universal Time). "
Packit 01d647
                "<TimeStamp> is expressed as three RATIONAL values "
Packit 01d647
                "giving the hour, minute, and second (atomic clock)."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 3, print0x0007),
Packit 01d647
        TagInfo(0x0008, "GPSSatellites", N_("GPS Satellites"),
Packit 01d647
                N_("Indicates the GPS satellites used for measurements. This tag can be used "
Packit 01d647
                "to describe the number of satellites, their ID number, angle of elevation, "
Packit 01d647
                "azimuth, SNR and other information in ASCII notation. The format is not "
Packit 01d647
                "specified. If the GPS receiver is incapable of taking measurements, value "
Packit 01d647
                "of the tag is set to NULL."),
Packit 01d647
                gpsId, gpsTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0009, "GPSStatus", N_("GPS Status"),
Packit 01d647
                N_("Indicates the status of the GPS receiver when the image is recorded. "
Packit 01d647
                "\"A\" means measurement is in progress, and \"V\" means the measurement "
Packit 01d647
                "is Interoperability."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, print0x0009),
Packit 01d647
        TagInfo(0x000a, "GPSMeasureMode", N_("GPS Measure Mode"),
Packit 01d647
                N_("Indicates the GPS measurement mode. \"2\" means two-dimensional measurement and \"3\" "
Packit 01d647
                "means three-dimensional measurement is in progress."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, print0x000a),
Packit 01d647
        TagInfo(0x000b, "GPSDOP", N_("GPS Data Degree of Precision"),
Packit 01d647
                N_("Indicates the GPS DOP (data degree of precision). An HDOP value is written "
Packit 01d647
                "during two-dimensional measurement, and PDOP during three-dimensional measurement."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x000c, "GPSSpeedRef", N_("GPS Speed Reference"),
Packit 01d647
                N_("Indicates the unit used to express the GPS receiver speed of movement. "
Packit 01d647
                "\"K\" \"M\" and \"N\" represents kilometers per hour, miles per hour, and knots."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, print0x000c),
Packit 01d647
        TagInfo(0x000d, "GPSSpeed", N_("GPS Speed"),
Packit 01d647
                N_("Indicates the speed of GPS receiver movement."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x000e, "GPSTrackRef", N_("GPS Track Ref"),
Packit 01d647
                N_("Indicates the reference for giving the direction of GPS receiver movement. "
Packit 01d647
                "\"T\" denotes true direction and \"M\" is magnetic direction."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, printGPSDirRef),
Packit 01d647
        TagInfo(0x000f, "GPSTrack", N_("GPS Track"),
Packit 01d647
                N_("Indicates the direction of GPS receiver movement. The range of values is "
Packit 01d647
                "from 0.00 to 359.99."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x0010, "GPSImgDirectionRef", N_("GPS Image Direction Reference"),
Packit 01d647
                N_("Indicates the reference for giving the direction of the image when it is captured. "
Packit 01d647
                "\"T\" denotes true direction and \"M\" is magnetic direction."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, printGPSDirRef),
Packit 01d647
        TagInfo(0x0011, "GPSImgDirection", N_("GPS Image Direction"),
Packit 01d647
                N_("Indicates the direction of the image when it was captured. The range of values "
Packit 01d647
                "is from 0.00 to 359.99."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x0012, "GPSMapDatum", N_("GPS Map Datum"),
Packit 01d647
                N_("Indicates the geodetic survey data used by the GPS receiver. If the survey data "
Packit 01d647
                "is restricted to Japan, the value of this tag is \"TOKYO\" or \"WGS-84\"."),
Packit 01d647
                gpsId, gpsTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0013, "GPSDestLatitudeRef", N_("GPS Destination Latitude Reference"),
Packit 01d647
                N_("Indicates whether the latitude of the destination point is north or south latitude. "
Packit 01d647
                "The ASCII value \"N\" indicates north latitude, and \"S\" is south latitude."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)),
Packit 01d647
        TagInfo(0x0014, "GPSDestLatitude", N_("GPS Destination Latitude"),
Packit 01d647
                N_("Indicates the latitude of the destination point. The latitude is expressed as "
Packit 01d647
                "three RATIONAL values giving the degrees, minutes, and seconds, respectively. "
Packit 01d647
                "If latitude is expressed as degrees, minutes and seconds, a typical format would "
Packit 01d647
                "be dd/1,mm/1,ss/1. When degrees and minutes are used and, for example, "
Packit 01d647
                "fractions of minutes are given up to two decimal places, the format would be "
Packit 01d647
                "dd/1,mmmm/100,0/1."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 3, printDegrees),
Packit 01d647
        TagInfo(0x0015, "GPSDestLongitudeRef", N_("GPS Destination Longitude Reference"),
Packit 01d647
                N_("Indicates whether the longitude of the destination point is east or west longitude. "
Packit 01d647
                "ASCII \"E\" indicates east longitude, and \"W\" is west longitude."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)),
Packit 01d647
        TagInfo(0x0016, "GPSDestLongitude", N_("GPS Destination Longitude"),
Packit 01d647
                N_("Indicates the longitude of the destination point. The longitude is expressed "
Packit 01d647
                "as three RATIONAL values giving the degrees, minutes, and seconds, respectively. "
Packit 01d647
                "If longitude is expressed as degrees, minutes and seconds, a typical format would be "
Packit 01d647
                "ddd/1,mm/1,ss/1. When degrees and minutes are used and, for example, fractions of "
Packit 01d647
                "minutes are given up to two decimal places, the format would be ddd/1,mmmm/100,0/1."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 3, printDegrees),
Packit 01d647
        TagInfo(0x0017, "GPSDestBearingRef", N_("GPS Destination Bearing Reference"),
Packit 01d647
                N_("Indicates the reference used for giving the bearing to the destination point. "
Packit 01d647
                "\"T\" denotes true direction and \"M\" is magnetic direction."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, printGPSDirRef),
Packit 01d647
        TagInfo(0x0018, "GPSDestBearing", N_("GPS Destination Bearing"),
Packit 01d647
                N_("Indicates the bearing to the destination point. The range of values is from "
Packit 01d647
                "0.00 to 359.99."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x0019, "GPSDestDistanceRef", N_("GPS Destination Distance Reference"),
Packit 01d647
                N_("Indicates the unit used to express the distance to the destination point. "
Packit 01d647
                "\"K\", \"M\" and \"N\" represent kilometers, miles and knots."),
Packit 01d647
                gpsId, gpsTags, asciiString, 2, print0x0019),
Packit 01d647
        TagInfo(0x001a, "GPSDestDistance", N_("GPS Destination Distance"),
Packit 01d647
                N_("Indicates the distance to the destination point."),
Packit 01d647
                gpsId, gpsTags, unsignedRational, 1, printValue),
Packit 01d647
        TagInfo(0x001b, "GPSProcessingMethod", N_("GPS Processing Method"),
Packit 01d647
                N_("A character string recording the name of the method used for location finding. "
Packit Service fb147c
                "The string encoding is defined using the same scheme as UserComment."),
Packit Service fb147c
                gpsId, gpsTags, comment, 0, printValue),
Packit 01d647
        TagInfo(0x001c, "GPSAreaInformation", N_("GPS Area Information"),
Packit Service fb147c
                N_("A character string recording the name of the GPS area."
Packit Service fb147c
                "The string encoding is defined using the same scheme as UserComment."),
Packit Service fb147c
                gpsId, gpsTags, comment, 0, printValue),
Packit 01d647
        TagInfo(0x001d, "GPSDateStamp", N_("GPS Date Stamp"),
Packit 01d647
                N_("A character string recording date and time information relative to UTC "
Packit 01d647
                "(Coordinated Universal Time). The format is \"YYYY:MM:DD.\"."),
Packit 01d647
                gpsId, gpsTags, asciiString, 11, printValue),
Packit 01d647
        TagInfo(0x001e, "GPSDifferential", N_("GPS Differential"),
Packit 01d647
                N_("Indicates whether differential correction is applied to the GPS receiver."),
Packit 01d647
                gpsId, gpsTags, unsignedShort, 1, print0x001e),
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownGpsTag)", N_("Unknown GPSInfo tag"),
Packit 01d647
                N_("Unknown GPSInfo tag"),
Packit 01d647
                gpsId, gpsTags, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
    const TagInfo* gpsTagList()
Packit 01d647
    {
Packit 01d647
        return gpsTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // MPF Tags http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/MPF.html
Packit 01d647
    static const TagInfo mpfTagInfo[] = {
Packit 01d647
        TagInfo(0xb000, "MPFVersion", N_("MPFVersion"),
Packit 01d647
                N_("MPF Version"),
Packit 01d647
                mpfId, mpfTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0xb001, "MPFNumberOfImages", N_("MPFNumberOfImages"),
Packit 01d647
                N_("MPF Number of Images"),
Packit 01d647
                mpfId, mpfTags, undefined, -1, printExifVersion),
Packit 01d647
        TagInfo(0xb002, "MPFImageList", N_("MPFImageList"),
Packit 01d647
                N_("MPF Image List"),
Packit 01d647
                mpfId, mpfTags, asciiString, 0, printValue),
Packit Service fb147c
        TagInfo(0xb003, "MPFImageUIDList", N_("MPFImageUIDList  "),
Packit 01d647
                N_("MPF Image UID List"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb004, "MPFTotalFrames", N_("MPFTotalFrames"),
Packit 01d647
                N_("MPF Total Frames"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb101, "MPFIndividualNum", N_("MPFIndividualNum"),
Packit 01d647
                N_("MPF Individual Num"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb201, "MPFPanOrientation", N_("MPFPanOrientation"),
Packit 01d647
                N_("MPFPanOrientation"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb202, "MPFPanOverlapH", N_("MPFPanOverlapH"),
Packit 01d647
                N_("MPF Pan Overlap Horizonal"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb203, "MPFPanOverlapV", N_("MPFPanOverlapV"),
Packit 01d647
                N_("MPF Pan Overlap Vertical"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb204, "MPFBaseViewpointNum", N_("MPFBaseViewpointNum"),
Packit 01d647
                N_("MPF Base Viewpoint Number"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb205, "MPFConvergenceAngle", N_("MPFConvergenceAngle"),
Packit 01d647
                N_("MPF Convergence Angle"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb206, "MPFBaselineLength", N_("MPFBaselineLength"),
Packit 01d647
                N_("MPF Baseline Length"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb207, "MPFVerticalDivergence", N_("MPFVerticalDivergence"),
Packit 01d647
                N_("MPF Vertical Divergence"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb208, "MPFAxisDistanceX", N_("MPFAxisDistanceX"),
Packit 01d647
                N_("MPF Axis Distance X"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb209, "MPFAxisDistanceY", N_("MPFAxisDistanceY"),
Packit 01d647
                N_("MPF Axis Distance Y"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb20a, "MPFAxisDistanceZ", N_("MPFAxisDistanceZ"),
Packit 01d647
                N_("MPF Axis Distance Z"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb20b, "MPFYawAngle", N_("MPFYawAngle"),
Packit 01d647
                N_("MPF Yaw Angle"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb20c, "MPFPitchAngle", N_("MPFPitchAngle"),
Packit 01d647
                N_("MPF Pitch Angle"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0xb20d, "MPFRollAngle", N_("MPFRollAngle"),
Packit 01d647
                N_("MPF Roll Angle"),
Packit 01d647
                mpfId, mpfTags, unsignedLong, 1, printValue),
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownMpfTag)", N_("Unknown MPF tag"),
Packit 01d647
                N_("Unknown MPF tag"),
Packit 01d647
                mpfId, mpfTags, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
    const TagInfo* mpfTagList()
Packit 01d647
    {
Packit 01d647
        return mpfTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // Exif Interoperability IFD Tags
Packit 01d647
    static const TagInfo iopTagInfo[] = {
Packit 01d647
        TagInfo(0x0001, "InteroperabilityIndex", N_("Interoperability Index"),
Packit 01d647
                N_("Indicates the identification of the Interoperability rule. "
Packit 01d647
                "Use \"R98\" for stating ExifR98 Rules. Four bytes used "
Packit 01d647
                "including the termination code (NULL). see the separate "
Packit 01d647
                "volume of Recommended Exif Interoperability Rules (ExifR98) "
Packit 01d647
                "for other tags used for ExifR98."),
Packit 01d647
                iopId, iopTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x0002, "InteroperabilityVersion", N_("Interoperability Version"),
Packit 01d647
                N_("Interoperability version"),
Packit 01d647
                iopId, iopTags, undefined, -1, printExifVersion),
Packit 01d647
        TagInfo(0x1000, "RelatedImageFileFormat", N_("Related Image File Format"),
Packit 01d647
                N_("File format of image file"),
Packit 01d647
                iopId, iopTags, asciiString, 0, printValue),
Packit 01d647
        TagInfo(0x1001, "RelatedImageWidth", N_("Related Image Width"),
Packit 01d647
                N_("Image width"),
Packit 01d647
                iopId, iopTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x1002, "RelatedImageLength", N_("Related Image Length"),
Packit 01d647
                N_("Image height"),
Packit 01d647
                iopId, iopTags, unsignedLong, 1, printValue),
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownIopTag)", N_("Unknown Exif Interoperability tag"),
Packit 01d647
                N_("Unknown Exif Interoperability tag"),
Packit 01d647
                iopId, iopTags, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
Packit 01d647
    const TagInfo* iopTagList()
Packit 01d647
    {
Packit 01d647
        return iopTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // Synthesized Exiv2 Makernote info Tags (read-only)
Packit 01d647
    static const TagInfo mnTagInfo[] = {
Packit 01d647
        TagInfo(0x0001, "Offset", N_("Offset"),
Packit 01d647
                N_("Offset of the makernote from the start of the TIFF header."),
Packit 01d647
                mnId, makerTags, unsignedLong, 1, printValue),
Packit 01d647
        TagInfo(0x0002, "ByteOrder", N_("Byte Order"),
Packit 01d647
                N_("Byte order used to encode MakerNote tags, 'MM' (big-endian) or 'II' (little-endian)."),
Packit 01d647
                mnId, makerTags, asciiString, 0, printValue),
Packit 01d647
        // End of list marker
Packit 01d647
        TagInfo(0xffff, "(UnknownMnTag)", N_("Unknown Exiv2 Makernote info tag"),
Packit 01d647
                N_("Unknown Exiv2 Makernote info tag"),
Packit 01d647
                mnId, makerTags, asciiString, -1, printValue)
Packit 01d647
    };
Packit 01d647
Packit 01d647
    const TagInfo* mnTagList()
Packit 01d647
    {
Packit 01d647
        return mnTagInfo;
Packit 01d647
    }
Packit 01d647
Packit 01d647
Packit 01d647
Packit 01d647
    bool isMakerIfd(IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        bool rc = false;
Packit 01d647
        const GroupInfo* ii = find(groupInfo, ifdId);
Packit 01d647
        if (ii != 0 && 0 == strcmp(ii->ifdName_, "Makernote")) {
Packit 01d647
            rc = true;
Packit 01d647
        }
Packit 01d647
        return rc;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    bool isExifIfd(IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        bool rc;
Packit 01d647
        switch (ifdId) {
Packit 01d647
        case ifd0Id:
Packit 01d647
        case exifId:
Packit 01d647
        case gpsId:
Packit 01d647
        case iopId:
Packit 01d647
        case ifd1Id:
Packit 01d647
        case ifd2Id:
Packit 01d647
        case ifd3Id:
Packit 01d647
        case mpfId:
Packit 01d647
        case subImage1Id:
Packit 01d647
        case subImage2Id:
Packit 01d647
        case subImage3Id:
Packit 01d647
        case subImage4Id:
Packit 01d647
        case subImage5Id:
Packit 01d647
        case subImage6Id:
Packit 01d647
        case subImage7Id:
Packit 01d647
        case subImage8Id:
Packit 01d647
        case subImage9Id:
Packit 01d647
        case subThumb1Id:
Packit 01d647
        case panaRawId: rc = true; break;
Packit 01d647
        default:           rc = false; break;
Packit 01d647
        }
Packit 01d647
        return rc;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    void taglist(std::ostream& os, IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const TagInfo* ti = Internal::tagList(ifdId);
Packit 01d647
        if (ti != 0) {
Packit 01d647
            for (int k = 0; ti[k].tag_ != 0xffff; ++k) {
Packit 01d647
                os << ti[k] << "\n";
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
    } // taglist
Packit 01d647
Packit 01d647
    const TagInfo* tagList(IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const GroupInfo* ii = find(groupInfo, ifdId);
Packit 01d647
        if (ii == 0 || ii->tagList_ == 0) return 0;
Packit 01d647
        return ii->tagList_();
Packit 01d647
    } // tagList
Packit 01d647
Packit 01d647
    const TagInfo* tagInfo(uint16_t tag, IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const TagInfo* ti = tagList(ifdId);
Packit 01d647
        if (ti == 0) return 0;
Packit 01d647
        int idx = 0;
Packit 01d647
        for (idx = 0; ti[idx].tag_ != 0xffff; ++idx) {
Packit 01d647
            if (ti[idx].tag_ == tag) break;
Packit 01d647
        }
Packit 01d647
        return &ti[idx];
Packit 01d647
    } // tagInfo
Packit 01d647
Packit 01d647
    const TagInfo* tagInfo(const std::string& tagName, IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const TagInfo* ti = tagList(ifdId);
Packit 01d647
        if (ti == 0) return 0;
Packit 01d647
        const char* tn = tagName.c_str();
Packit 01d647
        if (tn == 0) return 0;
Packit 01d647
        for (int idx = 0; ti[idx].tag_ != 0xffff; ++idx) {
Packit 01d647
            if (0 == strcmp(ti[idx].name_, tn)) {
Packit 01d647
                return &ti[idx];
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
        return 0;
Packit 01d647
    } // tagInfo
Packit 01d647
Packit 01d647
    IfdId groupId(const std::string& groupName)
Packit 01d647
    {
Packit 01d647
        IfdId ifdId = ifdIdNotSet;
Packit 01d647
        const GroupInfo* ii = find(groupInfo, GroupInfo::GroupName(groupName));
Packit 01d647
        if (ii != 0) ifdId = static_cast<IfdId>(ii->ifdId_);
Packit 01d647
        return ifdId;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    const char* ifdName(IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const GroupInfo* ii = find(groupInfo, ifdId);
Packit 01d647
        if (ii == 0) return groupInfo[0].ifdName_;
Packit 01d647
        return ii->ifdName_;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    const char* groupName(IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const GroupInfo* ii = find(groupInfo, ifdId);
Packit 01d647
        if (ii == 0) return groupInfo[0].groupName_;
Packit 01d647
        return ii->groupName_;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& printValue(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        return os << value;
Packit 01d647
    }
Packit 01d647
Packit Service fb147c
    std::ostream& printBitmask(std::ostream& os, const Value& value, const ExifData* metadata)
Packit Service fb147c
    {
Packit Service fb147c
        if (value.typeId() == Exiv2::unsignedShort || value.typeId() == Exiv2::signedShort)
Packit Service fb147c
        {
Packit Service fb147c
            uint16_t bit   = 0;
Packit Service fb147c
            uint16_t comma = 0;
Packit Service fb147c
            for (uint16_t i = 0; i < value.count(); i++ ) { // for each element in value array
Packit Service fb147c
                uint16_t bits = static_cast<uint16_t>(value.toLong(i));
Packit Service fb147c
                for (uint16_t b = 0; b < 16; ++b) { // for every bit
Packit Service fb147c
                    if (bits & (1 << b)) {
Packit Service fb147c
                        if ( comma++ ) {
Packit Service fb147c
                            os << ",";
Packit Service fb147c
                        }
Packit Service fb147c
                        os << bit;
Packit Service fb147c
                    }
Packit Service fb147c
                    bit++ ;
Packit Service fb147c
                }
Packit Service fb147c
            }
Packit Service fb147c
            // if no bits are set, print "(none)"
Packit Service fb147c
            if ( !comma ) os << N_("(none)");
Packit Service fb147c
        } else {
Packit Service fb147c
            printValue(os,value,metadata);
Packit Service fb147c
        }
Packit Service fb147c
        return os;
Packit Service fb147c
    }
Packit Service fb147c
Packit 01d647
    float fnumber(float apertureValue)
Packit 01d647
    {
Packit 01d647
        return std::exp(std::log(2.0f) * apertureValue / 2.f);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    URational exposureTime(float shutterSpeedValue)
Packit 01d647
    {
Packit 01d647
        URational ur(1, 1);
Packit 01d647
        double tmp = std::exp(std::log(2.0) * static_cast<double>(shutterSpeedValue));
Packit 01d647
        if (tmp > 1) {
Packit 01d647
            ur.second = static_cast<long>(tmp + 0.5);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            ur.first = static_cast<long>(1/tmp + 0.5);
Packit 01d647
        }
Packit 01d647
        return ur;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    uint16_t tagNumber(const std::string& tagName, IfdId ifdId)
Packit 01d647
    {
Packit 01d647
        const TagInfo* ti = tagInfo(tagName, ifdId);
Packit 01d647
        if (ti != 0 && ti->tag_ != 0xffff) return ti->tag_;
Packit 01d647
        if (!isHex(tagName, 4, "0x")) throw Error(kerInvalidTag, tagName, ifdId);
Packit 01d647
        std::istringstream is(tagName);
Packit 01d647
        uint16_t tag;
Packit 01d647
        is >> std::hex >> tag;
Packit 01d647
        return tag;
Packit 01d647
    } // tagNumber
Packit 01d647
Packit 01d647
    std::ostream& printLong(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        Rational r = value.toRational();
Packit 01d647
        if (r.second != 0) return os << static_cast<long>(r.first) / r.second;
Packit 01d647
        return os << "(" << value << ")";
Packit 01d647
    } // printLong
Packit 01d647
Packit 01d647
    std::ostream& printFloat(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        Rational r = value.toRational();
Packit Service fb147c
        if (r.second != 0) {
Packit Service fb147c
            os << value.toFloat() ;
Packit Service fb147c
        } else {
Packit Service fb147c
            os << "(" << value << ")";
Packit Service fb147c
        }
Packit Service fb147c
        return os;
Packit 01d647
    } // printFloat
Packit 01d647
Packit 01d647
    std::ostream& printDegrees(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        if (value.count() == 3) {
Packit 01d647
            static const char* unit[] = { "deg", "'", "\"" };
Packit Service fb147c
            for (int i = 0; i < value.count() ; ++i) {
Packit Service fb147c
                const int v = (int) (value.toFloat(i)+0.5f); // nearest integer
Packit Service fb147c
                os << (i != 0? " " : "") << v << unit[i];
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << value;
Packit 01d647
        }
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    } // printDegrees
Packit 01d647
Packit 01d647
    std::ostream& printUcs2(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        bool cnv = false;
Packit 01d647
        if (value.typeId() == unsignedByte && value.size() > 0) {
Packit 01d647
            DataBuf buf(value.size());
Packit 01d647
            value.copy(buf.pData_, invalidByteOrder);
Packit 01d647
            // Strip trailing odd byte due to failing UCS-2 conversion
Packit 01d647
            if (buf.size_ % 2 == 1)  buf.size_ -=1;
Packit 01d647
Packit 01d647
            // Strip trailing UCS-2 0-characters
Packit 01d647
            while (buf.size_ >= 2) {
Packit 01d647
                if (buf.pData_[buf.size_ - 1] == 0 && buf.pData_[buf.size_ - 2] == 0) {
Packit 01d647
                    buf.size_ -= 2;
Packit 01d647
                } else {
Packit 01d647
                    break;
Packit 01d647
                }
Packit 01d647
            }
Packit 01d647
Packit 01d647
            std::string str((const char*)buf.pData_, buf.size_);
Packit 01d647
            cnv = convertStringCharset(str, "UCS-2LE", "UTF-8");
Packit 01d647
            if (cnv) os << str;
Packit 01d647
        }
Packit 01d647
        if (!cnv) os << value;
Packit 01d647
        return os;
Packit 01d647
    } // printUcs2
Packit 01d647
Packit 01d647
    std::ostream& printExifUnit(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifUnit)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0000(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        if (value.size() != 4 || value.typeId() != unsignedByte) {
Packit 01d647
            return os << value;
Packit 01d647
        }
Packit 01d647
Packit 01d647
        for (int i = 0; i < 3; i++) {
Packit 01d647
            os << value.toLong(i);
Packit 01d647
            os << ".";
Packit 01d647
        }
Packit 01d647
        os << value.toLong(3);
Packit 01d647
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0005(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSAltitudeRef)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0006(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        std::ostringstream oss;
Packit 01d647
        oss.copyfmt(os);
Packit 01d647
        const int32_t d = value.toRational().second;
Packit 01d647
        if (d == 0) return os << "(" << value << ")";
Packit 01d647
        const int p = d > 1 ? 1 : 0;
Packit 01d647
        os << std::fixed << std::setprecision(p) << value.toFloat() << " m";
Packit 01d647
        os.copyfmt(oss);
Packit 01d647
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0007(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        if (value.count() == 3) {
Packit 01d647
            for (int i = 0; i < 3; ++i) {
Packit 01d647
                if (value.toRational(i).second == 0) {
Packit 01d647
                    return os << "(" << value << ")";
Packit 01d647
                }
Packit 01d647
            }
Packit 01d647
            std::ostringstream oss;
Packit 01d647
            oss.copyfmt(os);
Packit 01d647
            const float sec = 3600 * value.toFloat(0)
Packit 01d647
                              + 60 * value.toFloat(1)
Packit 01d647
                              + value.toFloat(2);
Packit 01d647
            int p = 0;
Packit 01d647
            if (sec != static_cast<int>(sec)) p = 1;
Packit 01d647
Packit 01d647
            const int hh = static_cast<int>(sec / 3600);
Packit 01d647
            const int mm = static_cast<int>((sec - 3600 * hh) / 60);
Packit 01d647
            const float ss = sec - 3600 * hh - 60 * mm;
Packit 01d647
Packit 01d647
            os << std::setw(2) << std::setfill('0') << std::right << hh << ":"
Packit 01d647
               << std::setw(2) << std::setfill('0') << std::right << mm << ":"
Packit 01d647
               << std::setw(2 + p * 2) << std::setfill('0') << std::right
Packit 01d647
               << std::fixed << std::setprecision(p) << ss;
Packit 01d647
Packit 01d647
            os.copyfmt(oss);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << value;
Packit 01d647
        }
Packit 01d647
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0009(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSStatus)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x000a(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSMeasureMode)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x000c(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSSpeedRef)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0019(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSDestDistanceRef)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x001e(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSDifferential)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x0112(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifOrientation)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! YCbCrPositioning, tag 0x0213
Packit 01d647
    extern const TagDetails exifYCbCrPositioning[] = {
Packit 01d647
        { 1, N_("Centered") },
Packit 01d647
        { 2, N_("Co-sited") }
Packit 01d647
    };
Packit 01d647
    std::ostream& print0x0213(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifYCbCrPositioning)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x8298(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        // Print the copyright information in the format Photographer, Editor
Packit 01d647
        std::string val = value.toString();
Packit 01d647
        std::string::size_type pos = val.find('\0');
Packit 01d647
        if (pos != std::string::npos) {
Packit 01d647
            std::string photographer(val, 0, pos);
Packit 01d647
            if (photographer != " ") os << photographer;
Packit 01d647
            std::string editor(val, pos + 1);
Packit 01d647
            if (editor != "") {
Packit 01d647
                if (photographer != " ") os << ", ";
Packit 01d647
                os << editor;
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << val;
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x829a(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        if (value.count() == 0) return os;
Packit 01d647
        if (value.typeId() != unsignedRational) return os << "(" << value << ")";
Packit 01d647
Packit 01d647
        URational t = value.toRational();
Packit 01d647
        if (t.first == 0 || t.second == 0) {
Packit 01d647
            os << "(" << t << ")";
Packit 01d647
        }
Packit 01d647
        else if (t.second == t.first) {
Packit 01d647
            os << "1 s";
Packit 01d647
        }
Packit 01d647
        else if (t.second % t.first == 0) {
Packit 01d647
            t.second = t.second / t.first;
Packit 01d647
            t.first = 1;
Packit 01d647
            os << t << " s";
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << static_cast<float>(t.first) / t.second << " s";
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x829d(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        Rational fnumber = value.toRational();
Packit 01d647
        if (fnumber.second != 0) {
Packit 01d647
            std::ostringstream oss;
Packit 01d647
            oss.copyfmt(os);
Packit 01d647
            os << "F" << std::setprecision(2)
Packit 01d647
               << static_cast<float>(fnumber.first) / fnumber.second;
Packit 01d647
            os.copyfmt(oss);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! ExposureProgram, tag 0x8822
Packit 01d647
    extern const TagDetails exifExposureProgram[] = {
Packit 01d647
        { 0, N_("Not defined")       },
Packit 01d647
        { 1, N_("Manual")            },
Packit 01d647
        { 2, N_("Auto")              },
Packit 01d647
        { 3, N_("Aperture priority") },
Packit 01d647
        { 4, N_("Shutter priority")  },
Packit 01d647
        { 5, N_("Creative program")  },
Packit 01d647
        { 6, N_("Action program")    },
Packit 01d647
        { 7, N_("Portrait mode")     },
Packit 01d647
        { 8, N_("Landscape mode")    }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0x8822(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifExposureProgram)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x8827(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        return os << value.toLong();
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x9101(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        for (long i = 0; i < value.count(); ++i) {
Packit 01d647
            long l = value.toLong(i);
Packit 01d647
            switch (l) {
Packit 01d647
            case 0:  break;
Packit 01d647
            case 1:  os << "Y"; break;
Packit 01d647
            case 2:  os << "Cb"; break;
Packit 01d647
            case 3:  os << "Cr"; break;
Packit 01d647
            case 4:  os << "R"; break;
Packit 01d647
            case 5:  os << "G"; break;
Packit 01d647
            case 6:  os << "B"; break;
Packit 01d647
            default: os << "(" << l << ")"; break;
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x9201(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        Rational r = value.toRational();
Packit 01d647
        if (!value.ok() || r.second == 0) return os << "(" << value << ")";
Packit 01d647
Packit 01d647
        URational ur = exposureTime(static_cast<float>(r.first) / r.second);
Packit 01d647
        os << ur.first;
Packit 01d647
        if (ur.second > 1) {
Packit 01d647
            os << "/" << ur.second;
Packit 01d647
        }
Packit 01d647
        return os << " s";
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x9202(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        if (   value.count() == 0
Packit 01d647
            || value.toRational().second == 0) {
Packit 01d647
            return os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        std::ostringstream oss;
Packit 01d647
        oss.copyfmt(os);
Packit 01d647
        os << "F" << std::setprecision(2) << fnumber(value.toFloat());
Packit 01d647
        os.copyfmt(oss);
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x9204(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        Rational bias = value.toRational();
Packit 01d647
Packit 01d647
        if (bias.first == 0 || bias.first == (int32_t)0x80000000 ) {
Packit 01d647
            os << "0 EV";
Packit 01d647
        } else if (bias.second <= 0) {
Packit 01d647
            os << "(" << bias.first << "/" << bias.second << ")";
Packit 01d647
        } else {
Packit 01d647
            int32_t d = gcd(bias.first, bias.second);
Packit 01d647
            int32_t num = std::abs(bias.first) / d;
Packit 01d647
            int32_t den = bias.second / d;
Packit 01d647
            os << (bias.first < 0 ? "-" : "+") << num;
Packit 01d647
            if (den != 1) {
Packit 01d647
                os << "/" << den;
Packit 01d647
            }
Packit 01d647
            os << " EV";
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x9206(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        Rational distance = value.toRational();
Packit 01d647
        if (distance.first == 0) {
Packit 01d647
            os << _("Unknown");
Packit 01d647
        }
Packit 01d647
        else if (static_cast<uint32_t>(distance.first) == 0xffffffff) {
Packit 01d647
            os << _("Infinity");
Packit 01d647
        }
Packit 01d647
        else if (distance.second != 0) {
Packit 01d647
            std::ostringstream oss;
Packit 01d647
            oss.copyfmt(os);
Packit 01d647
            os << std::fixed << std::setprecision(2)
Packit 01d647
               << (float)distance.first / distance.second
Packit 01d647
               << " m";
Packit 01d647
            os.copyfmt(oss);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! MeteringMode, tag 0x9207
Packit 01d647
    extern const TagDetails exifMeteringMode[] = {
Packit 01d647
        { 0,   N_("Unknown")                 },
Packit 01d647
        { 1,   N_("Average")                 },
Packit 01d647
        { 2,   N_("Center weighted average") },
Packit 01d647
        { 3,   N_("Spot")                    },
Packit 01d647
        { 4,   N_("Multi-spot")              },
Packit 01d647
        { 5,   N_("Multi-segment")           },
Packit 01d647
        { 6,   N_("Partial")                 },
Packit 01d647
        { 255, N_("Other")                   },
Packit 01d647
        { 255, N_("Other")                   }  // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0x9207(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifMeteringMode)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! LightSource, tag 0x9208
Packit 01d647
    extern const TagDetails exifLightSource[] = {
Packit 01d647
        {   0, N_("Unknown")                                 },
Packit 01d647
        {   1, N_("Daylight")                                },
Packit 01d647
        {   2, N_("Fluorescent")                             },
Packit 01d647
        {   3, N_("Tungsten (incandescent light)")           },
Packit 01d647
        {   4, N_("Flash")                                   },
Packit 01d647
        {   9, N_("Fine weather")                            },
Packit 01d647
        {  10, N_("Cloudy weather")                          },
Packit 01d647
        {  11, N_("Shade")                                   },
Packit 01d647
        {  12, N_("Daylight fluorescent (D 5700 - 7100K)")   },
Packit 01d647
        {  13, N_("Day white fluorescent (N 4600 - 5400K)")  },
Packit 01d647
        {  14, N_("Cool white fluorescent (W 3900 - 4500K)") },
Packit 01d647
        {  15, N_("White fluorescent (WW 3200 - 3700K)")     },
Packit 01d647
        {  17, N_("Standard light A")                        },
Packit 01d647
        {  18, N_("Standard light B")                        },
Packit 01d647
        {  19, N_("Standard light C")                        },
Packit 01d647
        {  20, N_("D55")                                     },
Packit 01d647
        {  21, N_("D65")                                     },
Packit 01d647
        {  22, N_("D75")                                     },
Packit 01d647
        {  23, N_("D50")                                     },
Packit 01d647
        {  24, N_("ISO studio tungsten")                     },
Packit 01d647
        { 255, N_("Other light source")                      }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0x9208(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifLightSource)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0x920a(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        Rational length = value.toRational();
Packit 01d647
        if (length.second != 0) {
Packit 01d647
            std::ostringstream oss;
Packit 01d647
            oss.copyfmt(os);
Packit 01d647
            os << std::fixed << std::setprecision(1)
Packit 01d647
               << (float)length.first / length.second
Packit 01d647
               << " mm";
Packit 01d647
            os.copyfmt(oss);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! ColorSpace, tag 0xa001
Packit 01d647
    extern const TagDetails exifColorSpace[] = {
Packit 01d647
        {      1, N_("sRGB")         },
Packit 01d647
        {      2, N_("Adobe RGB")    },    // Not defined to Exif 2.2 spec. But used by a lot of cameras.
Packit 01d647
        { 0xffff, N_("Uncalibrated") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa001(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifColorSpace)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! SensingMethod, tag 0xa217
Packit 01d647
    extern const TagDetails exifSensingMethod[] = {
Packit 01d647
        { 1, N_("Not defined")             },
Packit 01d647
        { 2, N_("One-chip color area")     },
Packit 01d647
        { 3, N_("Two-chip color area")     },
Packit 01d647
        { 4, N_("Three-chip color area")   },
Packit 01d647
        { 5, N_("Color sequential area")   },
Packit 01d647
        { 7, N_("Trilinear sensor")        },
Packit 01d647
        { 8, N_("Color sequential linear") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa217(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifSensingMethod)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! FileSource, tag 0xa300
Packit 01d647
    extern const TagDetails exifFileSource[] = {
Packit 01d647
        { 1, N_("Film scanner")            },   // Not defined to Exif 2.2 spec.
Packit 01d647
        { 2, N_("Reflexion print scanner") },   // but used by some scanner device softwares.
Packit 01d647
        { 3, N_("Digital still camera")    }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa300(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifFileSource)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! SceneType, tag 0xa301
Packit 01d647
    extern const TagDetails exifSceneType[] = {
Packit 01d647
        { 1, N_("Directly photographed") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa301(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifSceneType)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! CustomRendered, tag 0xa401
Packit 01d647
    extern const TagDetails exifCustomRendered[] = {
Packit 01d647
        { 0, N_("Normal process") },
Packit 01d647
        { 1, N_("Custom process") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa401(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifCustomRendered)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! ExposureMode, tag 0xa402
Packit 01d647
    extern const TagDetails exifExposureMode[] = {
Packit 01d647
        { 0, N_("Auto")         },
Packit 01d647
        { 1, N_("Manual")       },
Packit 01d647
        { 2, N_("Auto bracket") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa402(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifExposureMode)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! WhiteBalance, tag 0xa403
Packit 01d647
    extern const TagDetails exifWhiteBalance[] = {
Packit 01d647
        { 0, N_("Auto")   },
Packit 01d647
        { 1, N_("Manual") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa403(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifWhiteBalance)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0xa404(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        std::ios::fmtflags f( os.flags() );
Packit 01d647
        Rational zoom = value.toRational();
Packit 01d647
        if (zoom.second == 0) {
Packit 01d647
            os << _("Digital zoom not used");
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            std::ostringstream oss;
Packit 01d647
            oss.copyfmt(os);
Packit 01d647
            os << std::fixed << std::setprecision(1)
Packit 01d647
               << (float)zoom.first / zoom.second;
Packit 01d647
            os.copyfmt(oss);
Packit 01d647
        }
Packit 01d647
        os.flags(f);
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& print0xa405(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        long length = value.toLong();
Packit 01d647
        if (length == 0) {
Packit 01d647
            os << _("Unknown");
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << length << ".0 mm";
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! SceneCaptureType, tag 0xa406
Packit 01d647
    extern const TagDetails exifSceneCaptureType[] = {
Packit 01d647
        { 0, N_("Standard")    },
Packit 01d647
        { 1, N_("Landscape")   },
Packit 01d647
        { 2, N_("Portrait")    },
Packit 01d647
        { 3, N_("Night scene") },
Packit 01d647
        { 3, N_("Night scene") }                // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa406(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifSceneCaptureType)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! GainControl, tag 0xa407
Packit 01d647
    extern const TagDetails exifGainControl[] = {
Packit 01d647
        { 0, N_("None")           },
Packit 01d647
        { 1, N_("Low gain up")    },
Packit 01d647
        { 2, N_("High gain up")   },
Packit 01d647
        { 3, N_("Low gain down")  },
Packit 01d647
        { 4, N_("High gain down") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa407(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGainControl)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! Saturation, tag 0xa409
Packit 01d647
    extern const TagDetails exifSaturation[] = {
Packit 01d647
        { 0, N_("Normal") },
Packit 01d647
        { 1, N_("Low")    },
Packit 01d647
        { 2, N_("High")   }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa409(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifSaturation)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! SubjectDistanceRange, tag 0xa40c
Packit 01d647
    extern const TagDetails exifSubjectDistanceRange[] = {
Packit 01d647
        { 0, N_("Unknown")      },
Packit 01d647
        { 1, N_("Macro")        },
Packit 01d647
        { 2, N_("Close view")   },
Packit 01d647
        { 3, N_("Distant view") },
Packit 01d647
        { 3, N_("Distant view") }               // To silence compiler warning
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& print0xa40c(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifSubjectDistanceRange)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! GPS direction ref, tags 0x000e, 0x0010, 0x0017
Packit 01d647
    extern const TagDetails exifGPSDirRef[] = {
Packit 01d647
        { 'T', N_("True direction")     },
Packit 01d647
        { 'M', N_("Magnetic direction") }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& printGPSDirRef(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifGPSDirRef)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    //! Contrast, tag 0xa408 and Sharpness, tag 0xa40a
Packit 01d647
    extern const TagDetails exifNormalSoftHard[] = {
Packit 01d647
        { 0, N_("Normal") },
Packit 01d647
        { 1, N_("Soft")   },
Packit 01d647
        { 2, N_("Hard")   }
Packit 01d647
    };
Packit 01d647
Packit 01d647
    std::ostream& printNormalSoftHard(std::ostream& os, const Value& value, const ExifData* metadata)
Packit 01d647
    {
Packit 01d647
        return EXV_PRINT_TAG(exifNormalSoftHard)(os, value, metadata);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& printExifVersion(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        if (value.size() != 4 || value.typeId() != undefined) {
Packit 01d647
            return os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
Packit 01d647
        char s[5];
Packit 01d647
        for (int i = 0; i < 4; ++i) {
Packit 01d647
            s[i] = static_cast<char>(value.toLong(i));
Packit 01d647
        }
Packit 01d647
        s[4] = '\0';
Packit 01d647
Packit 01d647
        return printVersion(os, s);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& printXmpVersion(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        if (value.size() != 4 || value.typeId() != xmpText) {
Packit 01d647
            return os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
Packit 01d647
        return printVersion(os, value.toString());
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::ostream& printXmpDate(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        if (!(value.size() == 19 || value.size() == 20) || value.typeId() != xmpText) {
Packit 01d647
            return os << value;
Packit 01d647
        }
Packit 01d647
Packit 01d647
        std::string stringValue = value.toString();
Packit 01d647
        if (stringValue[19] == 'Z') {
Packit 01d647
            stringValue = stringValue.substr(0, 19);
Packit 01d647
        }
Packit 01d647
        for (unsigned int i = 0; i < stringValue.length(); ++i) {
Packit 01d647
            if (stringValue[i] == 'T') stringValue[i] = ' ';
Packit 01d647
            if (stringValue[i] == '-') stringValue[i] = ':';
Packit 01d647
        }
Packit 01d647
Packit 01d647
        return os << stringValue;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    const GroupInfo *groupList()
Packit 01d647
    {
Packit 01d647
        return groupInfo + 1;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    const TagInfo* tagList(const std::string& groupName)
Packit 01d647
    {
Packit 01d647
        const GroupInfo* ii = find(groupInfo, GroupInfo::GroupName(groupName));
Packit 01d647
        if (ii == 0 || ii->tagList_ == 0) {
Packit 01d647
            return 0;
Packit 01d647
        }
Packit 01d647
        return ii->tagList_();
Packit 01d647
    }
Packit 01d647
Packit 01d647
} }