diff --git a/src/makernote.cpp b/src/makernote.cpp index abc09755..6680007d 100644 --- a/src/makernote.cpp +++ b/src/makernote.cpp @@ -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(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(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(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, diff --git a/src/makernote_int.hpp b/src/makernote_int.hpp index 4f65c415..825c4f89 100644 --- a/src/makernote_int.hpp +++ b/src/makernote_int.hpp @@ -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, diff --git a/src/tiffcomposite.cpp b/src/tiffcomposite.cpp index 15070d52..d3861def 100644 --- a/src/tiffcomposite.cpp +++ b/src/tiffcomposite.cpp @@ -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 diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index 6cf177ce..0d73f2d3 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -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 }, - { 0x0003, Group::olympmn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry }, - { 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 }, + { 0x0003, Group::olymp1mn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry }, + { 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 }, + { 0x0003, Group::olymp2mn, Group::minocsn, 0x927c, Group::exif, newTiffArrayEntry }, + { 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*/ },