Added Sigma MakerNote
parent
5fa6aa95fe
commit
5cb9ec44d2
@ -0,0 +1,146 @@
|
|||||||
|
// ***************************************************************** -*- C++ -*-
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2004 Andreas Huggel <ahuggel@gmx.net>
|
||||||
|
*
|
||||||
|
* This program is part of the Exiv2 distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
File: sigmamn.cpp
|
||||||
|
Version: $Name: $ $Revision: 1.1 $
|
||||||
|
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
|
||||||
|
History: 02-Apr-04, ahu: created
|
||||||
|
Credits: Sigma and Foveon MakerNote implemented according to the specification
|
||||||
|
in "SIGMA and FOVEON EXIF MakerNote Documentation" by Foveon.
|
||||||
|
<http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html>
|
||||||
|
*/
|
||||||
|
// *****************************************************************************
|
||||||
|
#include "rcsid.hpp"
|
||||||
|
EXIV2_RCSID("@(#) $Name: $ $Revision: 1.1 $ $RCSfile: sigmamn.cpp,v $")
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// included header files
|
||||||
|
#include "types.hpp"
|
||||||
|
#include "sigmamn.hpp"
|
||||||
|
#include "makernote.hpp"
|
||||||
|
#include "value.hpp"
|
||||||
|
|
||||||
|
// + standard includes
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
// Define DEBUG_MAKERNOTE to output debug information to std::cerr
|
||||||
|
#undef DEBUG_MAKERNOTE
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// class member definitions
|
||||||
|
namespace Exif {
|
||||||
|
|
||||||
|
const SigmaMakerNote::RegisterMakerNote SigmaMakerNote::register_;
|
||||||
|
|
||||||
|
// Sigma (Foveon) MakerNote Tag Info
|
||||||
|
static const MakerNote::MnTagInfo sigmaMnTagInfo[] = {
|
||||||
|
MakerNote::MnTagInfo(0x0002, "SerialNumber", "Camera serial number"),
|
||||||
|
MakerNote::MnTagInfo(0x0003, "DriveMode", "Drive Mode"),
|
||||||
|
MakerNote::MnTagInfo(0x0004, "ResolutionMode", "Resolution Mode"),
|
||||||
|
MakerNote::MnTagInfo(0x0005, "AutofocusMode", "Autofocus mode"),
|
||||||
|
MakerNote::MnTagInfo(0x0006, "FocusSetting", "Foxus setting"),
|
||||||
|
MakerNote::MnTagInfo(0x0007, "WhiteBalance", "White balance"),
|
||||||
|
MakerNote::MnTagInfo(0x0008, "ExposureMode", "Exposure mode"),
|
||||||
|
MakerNote::MnTagInfo(0x0009, "MeteringMode", "Metering mode"),
|
||||||
|
MakerNote::MnTagInfo(0x000a, "LensRange", "Lens focal length range"),
|
||||||
|
MakerNote::MnTagInfo(0x000b, "ColorSpace", "Color space"),
|
||||||
|
MakerNote::MnTagInfo(0x000c, "Exposure", "Exposure"),
|
||||||
|
MakerNote::MnTagInfo(0x000d, "Contrast", "Contrast"),
|
||||||
|
MakerNote::MnTagInfo(0x000e, "Shadow", "Shadow"),
|
||||||
|
MakerNote::MnTagInfo(0x000f, "Highlight", "Highlight"),
|
||||||
|
MakerNote::MnTagInfo(0x0010, "Saturation", "Saturation"),
|
||||||
|
MakerNote::MnTagInfo(0x0011, "Sharpness", "Sharpness"),
|
||||||
|
MakerNote::MnTagInfo(0x0012, "FillLight", "X3 Fill light"),
|
||||||
|
MakerNote::MnTagInfo(0x0014, "ColorAdjustment", "Color adjustment"),
|
||||||
|
MakerNote::MnTagInfo(0x0015, "AdjustmentMode", "Adjustment mode"),
|
||||||
|
MakerNote::MnTagInfo(0x0016, "Quality", "Quality"),
|
||||||
|
MakerNote::MnTagInfo(0x0017, "Firmware", "Firmware"),
|
||||||
|
MakerNote::MnTagInfo(0x0018, "Software", "Software"),
|
||||||
|
MakerNote::MnTagInfo(0x0019, "AutoBracket", "Auto bracket"),
|
||||||
|
// End of list marker
|
||||||
|
MakerNote::MnTagInfo(0xffff, "(UnknownSigmaMakerNoteTag)", "Unknown SigmaMakerNote tag")
|
||||||
|
};
|
||||||
|
|
||||||
|
SigmaMakerNote::SigmaMakerNote(bool alloc)
|
||||||
|
: IfdMakerNote(sigmaMnTagInfo, alloc), sectionName_("Sigma")
|
||||||
|
{
|
||||||
|
// My one and only Sigma sample has two undocumented extra bytes
|
||||||
|
// (0x01, 0x00) after the ID string and before the start of the
|
||||||
|
// Makernote IFD. Adding them to the ID string is a hack...
|
||||||
|
prefix_ = std::string("SIGMA\0\0\0\x1\0", 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
MakerNote* SigmaMakerNote::clone(bool alloc) const
|
||||||
|
{
|
||||||
|
return createSigmaMakerNote(alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& SigmaMakerNote::printTag(std::ostream& os,
|
||||||
|
uint16 tag,
|
||||||
|
const Value& value) const
|
||||||
|
{
|
||||||
|
switch (tag) {
|
||||||
|
case 0x0008: print0x0008(os, value); break;
|
||||||
|
case 0x0009: print0x0009(os, value); break;
|
||||||
|
default:
|
||||||
|
// All other tags (known or unknown) go here
|
||||||
|
os << value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& SigmaMakerNote::print0x0008(std::ostream& os,
|
||||||
|
const Value& value)
|
||||||
|
{
|
||||||
|
switch (value.toString()[0]) {
|
||||||
|
case 'P': os << "Program"; break;
|
||||||
|
case 'A': os << "Aperture priority"; break;
|
||||||
|
case 'S': os << "Shutter priority"; break;
|
||||||
|
case 'M': os << "Manual"; break;
|
||||||
|
default: os << "(" << value << ")"; break;
|
||||||
|
}
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& SigmaMakerNote::print0x0009(std::ostream& os,
|
||||||
|
const Value& value)
|
||||||
|
{
|
||||||
|
switch (value.toString()[0]) {
|
||||||
|
case 'A': os << "Average"; break;
|
||||||
|
case 'C': os << "Center"; break;
|
||||||
|
case '8': os << "8-segment"; break;
|
||||||
|
default: os << "(" << value << ")"; break;
|
||||||
|
}
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// free functions
|
||||||
|
|
||||||
|
MakerNote* createSigmaMakerNote(bool alloc)
|
||||||
|
{
|
||||||
|
return new SigmaMakerNote(alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Exif
|
@ -0,0 +1,133 @@
|
|||||||
|
// ***************************************************************** -*- C++ -*-
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2004 Andreas Huggel <ahuggel@gmx.net>
|
||||||
|
*
|
||||||
|
* This program is part of the Exiv2 distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
@file sigmamn.hpp
|
||||||
|
@brief Sigma and Foveon MakerNote implemented according to the specification
|
||||||
|
in "SIGMA and FOVEON EXIF MakerNote Documentation" by Foveon.
|
||||||
|
<http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html>
|
||||||
|
@version $Name: $ $Revision: 1.1 $
|
||||||
|
@author Andreas Huggel (ahu)
|
||||||
|
<a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a>
|
||||||
|
@date 02-Apr-04, ahu: created
|
||||||
|
*/
|
||||||
|
#ifndef SIGMAMN_HPP_
|
||||||
|
#define SIGMAMN_HPP_
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// included header files
|
||||||
|
#include "types.hpp"
|
||||||
|
#include "makernote.hpp"
|
||||||
|
|
||||||
|
// + standard includes
|
||||||
|
#include <string>
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// namespace extensions
|
||||||
|
namespace Exif {
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// class declarations
|
||||||
|
class Value;
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// free functions
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Return a pointer to a newly created empty MakerNote initialized to
|
||||||
|
operate in the memory management model indicated. The caller owns
|
||||||
|
this copy and is responsible to delete it!
|
||||||
|
|
||||||
|
@param alloc Memory management model for the new MakerNote. Determines if
|
||||||
|
memory required to store data should be allocated and deallocated
|
||||||
|
(true) or not (false). If false, only pointers to the buffer
|
||||||
|
provided to read() will be kept. See Ifd for more background on
|
||||||
|
this concept.
|
||||||
|
*/
|
||||||
|
MakerNote* createSigmaMakerNote(bool alloc =true);
|
||||||
|
|
||||||
|
// *****************************************************************************
|
||||||
|
// class definitions
|
||||||
|
|
||||||
|
//! MakerNote for Sigma (Foveon) cameras
|
||||||
|
class SigmaMakerNote : public IfdMakerNote {
|
||||||
|
public:
|
||||||
|
//! @name Creators
|
||||||
|
//@{
|
||||||
|
/*!
|
||||||
|
@brief Constructor. Allows to choose whether or not memory management
|
||||||
|
is required for the makernote entries.
|
||||||
|
*/
|
||||||
|
SigmaMakerNote(bool alloc =true);
|
||||||
|
//! Virtual destructor
|
||||||
|
virtual ~SigmaMakerNote() {}
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//! @name Accessors
|
||||||
|
//@{
|
||||||
|
MakerNote* clone(bool alloc =true) const;
|
||||||
|
//! Return the name of the makernote section ("Sigma")
|
||||||
|
std::string sectionName(uint16 tag) const { return sectionName_; }
|
||||||
|
std::ostream& printTag(std::ostream& os,
|
||||||
|
uint16 tag,
|
||||||
|
const Value& value) const;
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//! @name Print functions for Sigma (Foveon) %MakerNote tags
|
||||||
|
//@{
|
||||||
|
//! Print exposure mode
|
||||||
|
static std::ostream& print0x0008(std::ostream& os, const Value& value);
|
||||||
|
//! Print metering mode
|
||||||
|
static std::ostream& print0x0009(std::ostream& os, const Value& value);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
private:
|
||||||
|
//! Structure used to auto-register the MakerNote.
|
||||||
|
struct RegisterMakerNote {
|
||||||
|
//! Default constructor
|
||||||
|
RegisterMakerNote()
|
||||||
|
{
|
||||||
|
MakerNoteFactory& mnf = MakerNoteFactory::instance();
|
||||||
|
mnf.registerMakerNote("SIGMA", "*", createSigmaMakerNote);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/*!
|
||||||
|
The static member variable is initialized before main (see note) and
|
||||||
|
will in the process register the MakerNote class. (Remember the
|
||||||
|
definition of the variable in the implementation file!)
|
||||||
|
|
||||||
|
@note The standard says that, if no function is explicitly called ever
|
||||||
|
in a module, then that module's static data might be never
|
||||||
|
initialized. This clause was introduced to allow dynamic link
|
||||||
|
libraries. The idea is, with this clause the loader is not
|
||||||
|
forced to eagerly load all modules, but load them only on
|
||||||
|
demand.
|
||||||
|
*/
|
||||||
|
static const RegisterMakerNote register_;
|
||||||
|
|
||||||
|
//! The section name (second part of the key) used for makernote tags
|
||||||
|
std::string sectionName_;
|
||||||
|
|
||||||
|
}; // class SigmaMakerNote
|
||||||
|
|
||||||
|
} // namespace Exif
|
||||||
|
|
||||||
|
#endif // #ifndef SIGMAMN_HPP_
|
Loading…
Reference in New Issue