Skip to content

Commit 4f430aa

Browse files
committed
Initial support for OM System MakerNote
(manually adapted from 9164369)
1 parent 8f9b396 commit 4f430aa

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

src/makernote_int.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ const TiffMnRegistry TiffMnCreator::registry_[] = {
9797
{"Minolta", minoltaId, newIfdMn, newIfdMn2},
9898
{"NIKON", ifdIdNotSet, newNikonMn, nullptr}, // mnGroup_ is not used
9999
{"OLYMPUS", ifdIdNotSet, newOlympusMn, nullptr}, // mnGroup_ is not used
100+
{"OM Digital", olympus2Id, newOMSystemMn, newOMSystemMn2},
100101
{"Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2},
101102
{"PENTAX", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used
102103
{"RICOH", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used
@@ -232,6 +233,41 @@ size_t Olympus2MnHeader::write(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) co
232233
return sizeOfSignature();
233234
} // Olympus2MnHeader::write
234235

236+
const byte OMSystemMnHeader::signature_[] = {'O', 'M', ' ', 'S', 'Y', 'S', 'T', 'E', 'M', 0x00, 0x00, 0x00, 'I', 'I', 0x04, 0x00};
237+
238+
size_t OMSystemMnHeader::sizeOfSignature() {
239+
return sizeof(signature_);
240+
}
241+
242+
OMSystemMnHeader::OMSystemMnHeader() {
243+
read(signature_, sizeOfSignature(), invalidByteOrder);
244+
}
245+
246+
size_t OMSystemMnHeader::size() const {
247+
return header_.size();
248+
}
249+
250+
size_t OMSystemMnHeader::ifdOffset() const {
251+
return sizeOfSignature();
252+
}
253+
254+
uint32_t OMSystemMnHeader::baseOffset(uint32_t mnOffset) const {
255+
return mnOffset;
256+
}
257+
258+
bool OMSystemMnHeader::read(const byte* pData, size_t size, ByteOrder /*byteOrder*/) {
259+
if (!pData || size < sizeOfSignature())
260+
return false;
261+
header_.alloc(sizeOfSignature());
262+
std::copy_n(pData, header_.size(), header_.data());
263+
return !(header_.size() < sizeOfSignature() || 0 != header_.cmpBytes(0, signature_, sizeOfSignature() - 2));
264+
}
265+
266+
size_t OMSystemMnHeader::write(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) const {
267+
ioWrapper.write(signature_, sizeOfSignature());
268+
return sizeOfSignature();
269+
} // OMSystemMnHeader::write
270+
235271
const byte FujiMnHeader::signature_[] = {'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M', 0x0c, 0x00, 0x00, 0x00};
236272
const ByteOrder FujiMnHeader::byteOrder_ = littleEndian;
237273

@@ -630,6 +666,18 @@ TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
630666
return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader);
631667
}
632668

669+
TiffComponent* newOMSystemMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* /*pData*/, size_t size,
670+
ByteOrder /*byteOrder*/) {
671+
// Require at least the header and an IFD with 1 entry
672+
if (size < OMSystemMnHeader::sizeOfSignature() + 18)
673+
return nullptr;
674+
return newOMSystemMn2(tag, group, mnGroup);
675+
}
676+
677+
TiffComponent* newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
678+
return new TiffIfdMakernote(tag, group, mnGroup, new OMSystemMnHeader);
679+
}
680+
633681
TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* /*pData*/, size_t size,
634682
ByteOrder /*byteOrder*/) {
635683
// Require at least the header and an IFD with 1 entry

src/makernote_int.hpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,36 @@ class Olympus2MnHeader : public MnHeader {
190190

191191
}; // class Olympus2MnHeader
192192

193+
//! Header of an OM Digital Solutions (ex Olympus) Makernote
194+
class OMSystemMnHeader : public MnHeader {
195+
public:
196+
//! @name Creators
197+
//@{
198+
//! Default constructor
199+
OMSystemMnHeader();
200+
//! Virtual destructor.
201+
~OMSystemMnHeader() override = default;
202+
//@}
203+
//! @name Manipulators
204+
//@{
205+
bool read(const byte* pData, size_t size, ByteOrder byteOrder) override;
206+
//@}
207+
//! @name Accessors
208+
//@{
209+
[[nodiscard]] size_t size() const override;
210+
size_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
211+
[[nodiscard]] size_t ifdOffset() const override;
212+
[[nodiscard]] uint32_t baseOffset(uint32_t mnOffset) const override;
213+
//@}
214+
//! Return the size of the makernote header signature
215+
static size_t sizeOfSignature();
216+
217+
private:
218+
DataBuf header_; //!< Data buffer for the makernote header
219+
static const byte signature_[]; //!< Olympus makernote header signature
220+
221+
}; // class OMSystemMnHeader
222+
193223
//! Header of a Fujifilm Makernote
194224
class FujiMnHeader : public MnHeader {
195225
public:
@@ -510,6 +540,12 @@ TiffComponent* newOlympusMn2(uint16_t tag, IfdId group, IfdId mnGroup);
510540
//! Function to create an Olympus II makernote
511541
TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup);
512542

543+
//! Function to create an OM Digital Solutions makernote
544+
TiffComponent* newOMSystemMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, ByteOrder byteOrder);
545+
546+
//! Function to create an OM Digital Solutions makernote
547+
TiffComponent* newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup);
548+
513549
//! Function to create a Fujifilm makernote
514550
TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, ByteOrder byteOrder);
515551

0 commit comments

Comments
 (0)