25 #include <libopenraw/debug.h> 28 #include "mrwcontainer.hpp" 30 using namespace Debug;
38 : m_start(start), m_container(_container), m_loaded(false)
40 LOGDBG2(
"> DataBlock start == %ld\n", start);
41 if (m_container->
fetchData(m_name, m_start, 4) != 4) {
43 LOGWARN(
" Error reading block name %ld\n", start);
46 auto result = m_container->
readInt32(m_container->file());
49 LOGWARN(
" Error reading block length %ld\n", start);
52 m_length = result.unwrap();
53 LOGDBG1(
" DataBlock %s, length %d at %ld\n",
name().c_str(), m_length, m_start);
54 LOGDBG2(
"< DataBlock\n");
62 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
63 return mc->readInt8(mc->file());
70 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
71 return mc->readUInt8(mc->file());
78 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
83 DataBlock::string_val(off_t off)
88 s = mc->
fetchData(buf, m_start + DataBlockHeaderLength + off, 8);
98 MRWContainer::MRWContainer(
const IO::Stream::Ptr &_file, off_t _offset)
114 if ((p[0] == 0x00) && (p[1] ==
'M') && (p[2] ==
'R') && (p[3] ==
'M')) {
116 LOGDBG1(
"Identified MRW file\n");
121 LOGDBG1(
"Unidentified MRW file\n");
131 LOGDBG1(
"> MRWContainer::locateDirsPreHook()\n");
132 m_endian = ENDIAN_BIG;
135 mrm = std::make_shared<MRW::DataBlock>(m_offset,
this);
136 if (mrm->name() !=
"MRM") {
137 LOGWARN(
"MRW file begins not with MRM block, " 138 "but with unrecognized DataBlock :: name == %s\n",
139 mrm->name().c_str());
146 position = mrm->offset() + MRW::DataBlockHeaderLength;
147 while (position < pixelDataOffset()) {
148 auto ref = std::make_shared<MRW::DataBlock>(position,
this);
149 LOGDBG1(
"Loaded DataBlock :: name == %s\n", ref->name().c_str());
150 if (!ref || !ref->loaded()) {
153 if (ref->name() ==
"PRD") {
155 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
156 ref->name().c_str());
159 }
else if (ref->name() ==
"TTW") {
161 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
162 ref->name().c_str());
165 }
else if (ref->name() ==
"WBG") {
167 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
168 ref->name().c_str());
171 }
else if (ref->name() ==
"RIF") {
173 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
174 ref->name().c_str());
177 }
else if (ref->name() !=
"PAD") {
178 LOGWARN(
"File contains unrecognized DataBlock :: name == %s\n",
179 ref->name().c_str());
181 position = ref->offset() + MRW::DataBlockHeaderLength + ref->length();
186 LOGWARN(
"File does NOT contain expected DataBlock :: name == PRD\n");
190 LOGWARN(
"File does NOT contain expected DataBlock :: name == TTW\n");
194 LOGWARN(
"File does NOT contain expected DataBlock :: name == WBG\n");
198 LOGWARN(
"File does NOT contain expected DataBlock :: name == RIF\n");
203 if (fetchData(version,
204 prd->offset() + MRW::DataBlockHeaderLength + MRW::PRD_VERSION,
207 LOGDBG1(
" Error reading version string\n");
210 m_version = std::string(version);
211 LOGDBG1(
" MRW file version == %s\n", m_version.c_str());
217 m_offset = ttw->offset() + MRW::DataBlockHeaderLength;
222 setExifOffsetCorrection(m_offset);
223 LOGDBG1(
"setting correction to %ld\n", m_offset);
226 m_file->seek(m_offset, SEEK_SET);
227 LOGDBG1(
"< MRWContainer\n");
size_t fetchData(void *buf, off_t offset, size_t buf_size)
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
virtual IfdFileContainer::EndianType isMagicHeader(const char *p, int len) override
Option< uint16_t > uint16_val(off_t offset)
Option< int8_t > int8_val(off_t offset)
Option< uint8_t > uint8_val(off_t offset)
Option< uint16_t > readUInt16(const IO::Stream::Ptr &f)
Option< int32_t > readInt32(const IO::Stream::Ptr &f)
virtual bool locateDirsPreHook() override