Merge pull request #2172 from Exiv2/mergify/bp/main/pr-2167

Initial support for OM System MakerNote (backport #2167)
main
Luis Díaz Más 3 years ago committed by GitHub
commit 790fc465f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -97,6 +97,7 @@ const TiffMnRegistry TiffMnCreator::registry_[] = {
{"Minolta", minoltaId, newIfdMn, newIfdMn2}, {"Minolta", minoltaId, newIfdMn, newIfdMn2},
{"NIKON", ifdIdNotSet, newNikonMn, nullptr}, // mnGroup_ is not used {"NIKON", ifdIdNotSet, newNikonMn, nullptr}, // mnGroup_ is not used
{"OLYMPUS", ifdIdNotSet, newOlympusMn, nullptr}, // mnGroup_ is not used {"OLYMPUS", ifdIdNotSet, newOlympusMn, nullptr}, // mnGroup_ is not used
{"OM Digital", olympus2Id, newOMSystemMn, newOMSystemMn2},
{"Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2}, {"Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2},
{"PENTAX", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used {"PENTAX", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used
{"RICOH", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used {"RICOH", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used
@ -232,6 +233,42 @@ size_t Olympus2MnHeader::write(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) co
return sizeOfSignature(); return sizeOfSignature();
} // Olympus2MnHeader::write } // Olympus2MnHeader::write
const byte OMSystemMnHeader::signature_[] = {'O', 'M', ' ', 'S', 'Y', 'S', 'T', 'E',
'M', 0x00, 0x00, 0x00, 'I', 'I', 0x04, 0x00};
size_t OMSystemMnHeader::sizeOfSignature() {
return sizeof(signature_);
}
OMSystemMnHeader::OMSystemMnHeader() {
read(signature_, sizeOfSignature(), invalidByteOrder);
}
size_t OMSystemMnHeader::size() const {
return header_.size();
}
size_t OMSystemMnHeader::ifdOffset() const {
return sizeOfSignature();
}
uint32_t OMSystemMnHeader::baseOffset(uint32_t mnOffset) const {
return mnOffset;
}
bool OMSystemMnHeader::read(const byte* pData, size_t size, ByteOrder /*byteOrder*/) {
if (!pData || size < sizeOfSignature())
return false;
header_.alloc(sizeOfSignature());
std::copy_n(pData, header_.size(), header_.data());
return !(header_.size() < sizeOfSignature() || 0 != header_.cmpBytes(0, signature_, sizeOfSignature() - 2));
}
size_t OMSystemMnHeader::write(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) const {
ioWrapper.write(signature_, sizeOfSignature());
return sizeOfSignature();
} // OMSystemMnHeader::write
const byte FujiMnHeader::signature_[] = {'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M', 0x0c, 0x00, 0x00, 0x00}; const byte FujiMnHeader::signature_[] = {'F', 'U', 'J', 'I', 'F', 'I', 'L', 'M', 0x0c, 0x00, 0x00, 0x00};
const ByteOrder FujiMnHeader::byteOrder_ = littleEndian; const ByteOrder FujiMnHeader::byteOrder_ = littleEndian;
@ -630,6 +667,18 @@ TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader); return new TiffIfdMakernote(tag, group, mnGroup, new Olympus2MnHeader);
} }
TiffComponent* newOMSystemMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* /*pData*/, size_t size,
ByteOrder /*byteOrder*/) {
// Require at least the header and an IFD with 1 entry
if (size < OMSystemMnHeader::sizeOfSignature() + 18)
return nullptr;
return newOMSystemMn2(tag, group, mnGroup);
}
TiffComponent* newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup) {
return new TiffIfdMakernote(tag, group, mnGroup, new OMSystemMnHeader);
}
TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* /*pData*/, size_t size, TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* /*pData*/, size_t size,
ByteOrder /*byteOrder*/) { ByteOrder /*byteOrder*/) {
// Require at least the header and an IFD with 1 entry // Require at least the header and an IFD with 1 entry

@ -190,6 +190,36 @@ class Olympus2MnHeader : public MnHeader {
}; // class Olympus2MnHeader }; // class Olympus2MnHeader
//! Header of an OM Digital Solutions (ex Olympus) Makernote
class OMSystemMnHeader : public MnHeader {
public:
//! @name Creators
//@{
//! Default constructor
OMSystemMnHeader();
//! Virtual destructor.
~OMSystemMnHeader() override = default;
//@}
//! @name Manipulators
//@{
bool read(const byte* pData, size_t size, ByteOrder byteOrder) override;
//@}
//! @name Accessors
//@{
[[nodiscard]] size_t size() const override;
size_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
[[nodiscard]] size_t ifdOffset() const override;
[[nodiscard]] uint32_t baseOffset(uint32_t mnOffset) const override;
//@}
//! Return the size of the makernote header signature
static size_t sizeOfSignature();
private:
DataBuf header_; //!< Data buffer for the makernote header
static const byte signature_[]; //!< Olympus makernote header signature
}; // class OMSystemMnHeader
//! Header of a Fujifilm Makernote //! Header of a Fujifilm Makernote
class FujiMnHeader : public MnHeader { class FujiMnHeader : public MnHeader {
public: public:
@ -510,6 +540,13 @@ TiffComponent* newOlympusMn2(uint16_t tag, IfdId group, IfdId mnGroup);
//! Function to create an Olympus II makernote //! Function to create an Olympus II makernote
TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup); TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup);
//! Function to create an OM Digital Solutions makernote
TiffComponent* newOMSystemMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size,
ByteOrder byteOrder);
//! Function to create an OM Digital Solutions makernote
TiffComponent* newOMSystemMn2(uint16_t tag, IfdId group, IfdId mnGroup);
//! Function to create a Fujifilm makernote //! Function to create a Fujifilm makernote
TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, ByteOrder byteOrder); TiffComponent* newFujiMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, ByteOrder byteOrder);

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -0,0 +1,15 @@
from system_tests import CaseMeta, path
class OMSystemMakerNote(metaclass=CaseMeta):
"""
Regression test for the bug described in:
https://github.com/Exiv2/exiv2/issues/2126
"""
url = "https://github.com/Exiv2/exiv2/issues/2126"
filename = path("$data_path/test_issue_2126.exv")
commands = ["$exiv2 -q -K Exif.Olympus2.CameraID $filename"]
stdout = ["""Exif.Olympus2.CameraID Undefined 32 OM SYSTEM CAMERA
"""]
stderr = [""]
retval = [0]
Loading…
Cancel
Save