Skip to content

Commit 8c27e23

Browse files
authored
Merge pull request #2167 from Exiv2/027_omsystem_mn
Initial support for OM System MakerNote
2 parents 86c25e2 + 18e2b9a commit 8c27e23

File tree

4 files changed

+134
-0
lines changed

4 files changed

+134
-0
lines changed

src/makernote_int.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ namespace Exiv2 {
130130
{ "Minolta", minoltaId, newIfdMn, newIfdMn2 },
131131
{ "NIKON", ifdIdNotSet, newNikonMn, 0 }, // mnGroup_ is not used
132132
{ "OLYMPUS", ifdIdNotSet, newOlympusMn, 0 }, // mnGroup_ is not used
133+
{ "OM Digital", olympus2Id, newOMSystemMn, newOMSystemMn2 },
133134
{ "Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2 },
134135
{ "PENTAX", ifdIdNotSet, newPentaxMn, 0 }, // mnGroup_ is not used
135136
{ "RICOH", ifdIdNotSet, newPentaxMn, 0 }, // mnGroup_ is not used
@@ -330,6 +331,60 @@ namespace Exiv2 {
330331
return sizeOfSignature();
331332
} // Olympus2MnHeader::write
332333

334+
const byte OMSystemMnHeader::signature_[] = {
335+
'O', 'M', ' ', 'S', 'Y', 'S', 'T', 'E', 'M', 0x00, 0x00, 0x00, 'I', 'I', 0x04, 0x00
336+
};
337+
338+
uint32_t OMSystemMnHeader::sizeOfSignature()
339+
{
340+
return sizeof(signature_);
341+
}
342+
343+
OMSystemMnHeader::OMSystemMnHeader()
344+
{
345+
read(signature_, sizeOfSignature(), invalidByteOrder);
346+
}
347+
348+
OMSystemMnHeader::~OMSystemMnHeader()
349+
{
350+
}
351+
352+
uint32_t OMSystemMnHeader::size() const
353+
{
354+
return header_.size_;
355+
}
356+
357+
uint32_t OMSystemMnHeader::ifdOffset() const
358+
{
359+
return sizeOfSignature();
360+
}
361+
362+
uint32_t OMSystemMnHeader::baseOffset(uint32_t mnOffset) const
363+
{
364+
return mnOffset;
365+
}
366+
367+
bool OMSystemMnHeader::read(const byte* pData,
368+
uint32_t size,
369+
ByteOrder /*byteOrder*/)
370+
{
371+
if (!pData || size < sizeOfSignature()) return false;
372+
header_.alloc(sizeOfSignature());
373+
std::memcpy(header_.pData_, pData, header_.size_);
374+
if ( static_cast<uint32_t>(header_.size_) < sizeOfSignature()
375+
|| 0 != memcmp(header_.pData_, signature_, sizeOfSignature() - 2)) {
376+
return false;
377+
}
378+
return true;
379+
} // OMSystemMnHeader::read
380+
381+
uint32_t OMSystemMnHeader::write(IoWrapper& ioWrapper,
382+
ByteOrder /*byteOrder*/) const
383+
{
384+
ioWrapper.write(signature_, sizeOfSignature());
385+
return sizeOfSignature();
386+
} // OMSystemMnHeader::write
387+
333388
const byte FujiMnHeader::signature_[] = {
334389
'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M', 0x0c, 0x00, 0x00, 0x00
335390
};
@@ -900,6 +955,25 @@ namespace Exiv2 {
900955
return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader);
901956
}
902957

958+
TiffComponent* newOMSystemMn(uint16_t tag,
959+
IfdId group,
960+
IfdId mnGroup,
961+
const byte* /*pData*/,
962+
uint32_t size,
963+
ByteOrder /*byteOrder*/)
964+
{
965+
// Require at least the header and an IFD with 1 entry
966+
if (size < OMSystemMnHeader::sizeOfSignature() + 18) return 0;
967+
return newOMSystemMn2(tag, group, mnGroup);
968+
}
969+
970+
TiffComponent* newOMSystemMn2(uint16_t tag,
971+
IfdId group,
972+
IfdId mnGroup)
973+
{
974+
return new TiffIfdMakernote(tag, group, mnGroup, new OMSystemMnHeader);
975+
}
976+
903977
TiffComponent* newFujiMn(uint16_t tag,
904978
IfdId group,
905979
IfdId mnGroup,

src/makernote_int.hpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,38 @@ namespace Exiv2 {
232232

233233
}; // class Olympus2MnHeader
234234

235+
//! Header of an OM Digital Solutions (ex Olympus) Makernote
236+
class OMSystemMnHeader : public MnHeader {
237+
public:
238+
//! @name Creators
239+
//@{
240+
//! Default constructor
241+
OMSystemMnHeader();
242+
//! Virtual destructor.
243+
virtual ~OMSystemMnHeader();
244+
//@}
245+
//! @name Manipulators
246+
//@{
247+
virtual bool read(const byte* pData,
248+
uint32_t size,
249+
ByteOrder byteOrder);
250+
//@}
251+
//! @name Accessors
252+
//@{
253+
virtual uint32_t size() const;
254+
virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
255+
virtual uint32_t ifdOffset() const;
256+
virtual uint32_t baseOffset(uint32_t mnOffset) const;
257+
//@}
258+
//! Return the size of the makernote header signature
259+
static uint32_t sizeOfSignature();
260+
261+
private:
262+
DataBuf header_; //!< Data buffer for the makernote header
263+
static const byte signature_[]; //!< OM Digital Solutions makernote header signature
264+
265+
}; // class OMSystemMnHeader
266+
235267
//! Header of a Fujifilm Makernote
236268
class FujiMnHeader : public MnHeader {
237269
public:
@@ -587,6 +619,19 @@ namespace Exiv2 {
587619
IfdId group,
588620
IfdId mnGroup);
589621

622+
//! Function to create an OM Digital Solutions makernote
623+
TiffComponent* newOMSystemMn(uint16_t tag,
624+
IfdId group,
625+
IfdId mnGroup,
626+
const byte* pData,
627+
uint32_t size,
628+
ByteOrder byteOrder);
629+
630+
//! Function to create a OM Digital Solutions makernote
631+
TiffComponent* newOMSystemMn2(uint16_t tag,
632+
IfdId group,
633+
IfdId mnGroup);
634+
590635
//! Function to create a Fujifilm makernote
591636
TiffComponent* newFujiMn(uint16_t tag,
592637
IfdId group,

test/data/test_issue_2126.exv

21.8 KB
Binary file not shown.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from system_tests import CaseMeta, path
2+
3+
class OMSystemMakerNote(metaclass=CaseMeta):
4+
"""
5+
Regression test for the bug described in:
6+
https://github.com/Exiv2/exiv2/issues/2126
7+
"""
8+
url = "https://github.com/Exiv2/exiv2/issues/2126"
9+
10+
filename = path("$data_path/test_issue_2126.exv")
11+
commands = ["$exiv2 -q -K Exif.Olympus2.CameraID $filename"]
12+
stdout = ["""Exif.Olympus2.CameraID Undefined 32 OM SYSTEM CAMERA
13+
"""]
14+
stderr = [""]
15+
retval = [0]

0 commit comments

Comments
 (0)