Added Olympus2 makernote support, incomplete (Vladimir Nadvornik).

v0.27.3
Andreas Huggel 17 years ago
parent 4800f2db53
commit ee0b991695

@ -58,7 +58,7 @@ namespace Exiv2 {
{ "KONICA MINOLTA", Group::minoltamn, newIfdMn, newIfdMn2 },
{ "Minolta", Group::minoltamn, newIfdMn, newIfdMn2 },
{ "NIKON", Group::nikonmn, newNikonMn, 0 },
{ "OLYMPUS", Group::olympmn, newOlympusMn, newOlympusMn2 },
{ "OLYMPUS", Group::olympmn, newOlympusMn, 0 },
{ "Panasonic", Group::panamn, newPanasonicMn, newPanasonicMn2 },
{ "PENTAX", Group::pentaxmn, newPentaxMn, newPentaxMn2 },
{ "SIGMA", Group::sigmamn, newSigmaMn, newSigmaMn2 },
@ -68,7 +68,9 @@ namespace Exiv2 {
{ "-", Group::nikon2mn, 0, newNikon2Mn2 },
{ "-", Group::nikon3mn, 0, newNikon3Mn2 },
{ "-", Group::sony1mn, 0, newSony1Mn2 },
{ "-", Group::sony2mn, 0, newSony2Mn2 }
{ "-", Group::sony2mn, 0, newSony2Mn2 },
{ "-", Group::olymp1mn, 0, newOlympusMn2 },
{ "-", Group::olymp2mn, 0, newOlympus2Mn2 }
};
bool TiffMnRegistry::operator==(const std::string& key) const
@ -261,7 +263,7 @@ namespace Exiv2 {
header_.alloc(size_);
std::memcpy(header_.pData_, pData, header_.size_);
if ( static_cast<uint32_t>(header_.size_) < size_
|| 0 != memcmp(header_.pData_, signature_, 5)) {
|| 0 != memcmp(header_.pData_, signature_, 6)) {
return false;
}
return true;
@ -274,6 +276,41 @@ namespace Exiv2 {
return size_;
} // OlympusMnHeader::write
const byte Olympus2MnHeader::signature_[] = {
'O', 'L', 'Y', 'M', 'P', 'U', 'S', 0x00, 'I', 'I', 0x03, 0x00
};
const uint32_t Olympus2MnHeader::size_ = 12;
Olympus2MnHeader::Olympus2MnHeader()
{
read(signature_, size_, invalidByteOrder);
}
bool Olympus2MnHeader::read(const byte* pData,
uint32_t size,
ByteOrder /*byteOrder*/)
{
assert (pData != 0);
if (size < size_) return false;
header_.alloc(size_);
std::memcpy(header_.pData_, pData, header_.size_);
if ( static_cast<uint32_t>(header_.size_) < size_
|| 0 != memcmp(header_.pData_, signature_, 10)) {
return false;
}
return true;
} // Olympus2MnHeader::read
uint32_t Olympus2MnHeader::write(Blob& blob,
ByteOrder /*byteOrder*/) const
{
append(blob, signature_, size_);
return size_;
} // Olympus2MnHeader::write
const byte FujiMnHeader::signature_[] = {
'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M', 0x0c, 0x00, 0x00, 0x00
};
@ -538,11 +575,15 @@ namespace Exiv2 {
TiffComponent* newOlympusMn(uint16_t tag,
uint16_t group,
uint16_t mnGroup,
const byte* /*pData*/,
uint32_t /*size*/,
const byte* pData,
uint32_t size,
ByteOrder /*byteOrder*/)
{
return newOlympusMn2(tag, group, mnGroup);
if (size < 10 || std::string(reinterpret_cast<const char*>(pData), 10)
!= std::string("OLYMPUS\0II", 10)) {
return newOlympusMn2(tag, group, Group::olymp1mn);
}
return newOlympus2Mn2(tag, group, Group::olymp2mn);
}
TiffComponent* newOlympusMn2(uint16_t tag,
@ -552,6 +593,13 @@ namespace Exiv2 {
return new TiffIfdMakernote(tag, group, mnGroup, new OlympusMnHeader);
}
TiffComponent* newOlympus2Mn2(uint16_t tag,
uint16_t group,
uint16_t mnGroup)
{
return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader);
}
TiffComponent* newFujiMn(uint16_t tag,
uint16_t group,
uint16_t mnGroup,

@ -44,7 +44,7 @@ namespace Exiv2 {
namespace Internal {
namespace Group {
const uint16_t olympmn = 257; //!< Olympus makernote
const uint16_t olympmn = 257; //!< any Olympus makernote
const uint16_t fujimn = 258; //!< Fujifilm makernote
const uint16_t canonmn = 259; //!< Canon makernote
const uint16_t canoncs = 260; //!< Canon camera settings
@ -68,6 +68,8 @@ namespace Exiv2 {
const uint16_t canonpa = 278; //!< Canon panorama
const uint16_t pentaxmn = 279; //!< Pentax makernote
const uint16_t nikonpv = 280; //!< Nikon preview sub-IFD
const uint16_t olymp1mn = 281; //!< Olympus makernote
const uint16_t olymp2mn = 282; //!< Olympus II makernote
}
// *****************************************************************************
@ -354,6 +356,37 @@ namespace Exiv2 {
}; // class OlympusMnHeader
//! Header of an Olympus II Makernote
class Olympus2MnHeader : public MnHeader {
public:
//! @name Creators
//@{
//! Default constructor
Olympus2MnHeader();
//! Virtual destructor.
virtual ~Olympus2MnHeader() {}
//@}
//! @name Manipulators
//@{
virtual bool read(const byte* pData,
uint32_t size,
ByteOrder byteOrder);
//@}
//! @name Accessors
//@{
virtual uint32_t size() const { return header_.size_; }
virtual uint32_t write(Blob& blob, ByteOrder byteOrder) const;
virtual uint32_t ifdOffset() const { return size_; }
virtual uint32_t baseOffset(uint32_t mnOffset) const { return mnOffset; }
//@}
private:
DataBuf header_; //!< Data buffer for the makernote header
static const byte signature_[]; //!< Olympus makernote header signature
static const uint32_t size_; //!< Size of the signature
}; // class Olympus2MnHeader
//! Header of a Fujifilm Makernote
class FujiMnHeader : public MnHeader {
public:
@ -606,6 +639,11 @@ namespace Exiv2 {
uint16_t group,
uint16_t mnGroup);
//! Function to create an Olympus II makernote
TiffComponent* newOlympus2Mn2(uint16_t tag,
uint16_t group,
uint16_t mnGroup);
//! Function to create a Fujifilm makernote
TiffComponent* newFujiMn(uint16_t tag,
uint16_t group,

@ -77,7 +77,7 @@ namespace Exiv2 {
{ 8, "SubImage2" },
{ 9, "SubImage3" },
{ 10, "SubImage4" },
{ 257, "Olympus" },
// { 257, "Olympus" },
{ 258, "Fujifilm" },
{ 259, "Canon" },
{ 260, "CanonCs" },
@ -100,7 +100,9 @@ namespace Exiv2 {
{ 277, "CanonPi" },
{ 278, "CanonPa" },
{ 279, "Pentax" },
{ 280, "NikonPreview" }
{ 280, "NikonPreview" },
{ 281, "Olympus" },
{ 282, "Olympus" }
};
bool TiffGroupInfo::operator==(const uint16_t& group) const

@ -366,10 +366,17 @@ namespace Exiv2 {
// Olympus makernote - some Olympus cameras use Minolta structures
// Todo: Adding such tags will not work (maybe result in a Minolta makernote), need separate groups
{ 0x0001, Group::olympmn, Group::minocso, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ 0x0003, Group::olympmn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ Tag::next, Group::olympmn, Group::ignr, 0x927c, Group::exif, newTiffDirectory },
{ Tag::all, Group::olympmn, Group::olympmn, 0x927c, Group::exif, newTiffEntry },
{ 0x0001, Group::olymp1mn, Group::minocso, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ 0x0003, Group::olymp1mn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ Tag::next, Group::olymp1mn, Group::ignr, 0x927c, Group::exif, newTiffDirectory },
{ Tag::all, Group::olymp1mn, Group::olymp1mn, 0x927c, Group::exif, newTiffEntry },
// Olympus makernote - some Olympus cameras use Minolta structures
// Todo: Adding such tags will not work (maybe result in a Minolta makernote), need separate groups
{ 0x0001, Group::olymp2mn, Group::minocso, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ 0x0003, Group::olymp2mn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry<ttUnsignedLong, false> },
{ Tag::next, Group::olymp2mn, Group::ignr, 0x927c, Group::exif, newTiffDirectory },
{ Tag::all, Group::olymp2mn, Group::olymp2mn, 0x927c, Group::exif, newTiffEntry },
// Fujifilm makernote
{ Tag::next, Group::fujimn, Group::ignr, 0x927c, Group::exif, newTiffDirectory },
@ -456,7 +463,8 @@ namespace Exiv2 {
// TIFF mapping table for special decoding and encoding requirements
const TiffMappingInfo TiffMapping::tiffMappingInfo_[] = {
{ "*", Tag::all, Group::ignr, 0, 0 }, // Do not decode tags with group == Group::ignr
{ "OLYMPUS", 0x0100, Group::olympmn, &TiffDecoder::decodeOlympThumb, &TiffEncoder::encodeOlympThumb },
{ "OLYMPUS", 0x0100, Group::olymp1mn,&TiffDecoder::decodeOlympThumb, &TiffEncoder::encodeOlympThumb },
{ "OLYMPUS", 0x0100, Group::olymp2mn,&TiffDecoder::decodeOlympThumb, &TiffEncoder::encodeOlympThumb },
{ "*", 0x02bc, Group::ifd0, &TiffDecoder::decodeXmp, 0 /*done before the tree is traversed*/ },
{ "*", 0x83bb, Group::ifd0, &TiffDecoder::decodeIptc, 0 /*done before the tree is traversed*/ },
{ "*", 0x8649, Group::ifd0, &TiffDecoder::decodeIptc, 0 /*done before the tree is traversed*/ },

Loading…
Cancel
Save