Skip to content

Commit 790fc46

Browse files
authored
Merge pull request #2172 from Exiv2/mergify/bp/main/pr-2167
Initial support for OM System MakerNote (backport #2167)
2 parents fafe999 + 44c3aab commit 790fc46

File tree

5 files changed

+299
-0
lines changed

5 files changed

+299
-0
lines changed

src/makernote_int.cpp

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

@@ -630,6 +667,18 @@ TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
630667
return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader);
631668
}
632669

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

src/makernote_int.hpp

Lines changed: 37 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,13 @@ 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,
545+
ByteOrder byteOrder);
546+
547+
//! Function to create an OM Digital Solutions makernote
548+
TiffComponent* newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup);
549+
513550
//! Function to create a Fujifilm makernote
514551
TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, ByteOrder byteOrder);
515552

test/data/test_issue_2126.exv

21.8 KB
Binary file not shown.

test/data/test_reference_files/test_issue_2126.exv.out

Lines changed: 198 additions & 0 deletions
Large diffs are not rendered by default.
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)