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 == %lld\n", (
long long int)start);
41 if (m_container->
fetchData(m_name, m_start, 4) != 4) {
43 LOGWARN(
" Error reading block name %lld\n", (
long long int)start);
46 auto result = m_container->
readInt32(m_container->file());
49 LOGWARN(
" Error reading block length %lld\n", (
long long int)start);
52 m_length = result.value();
53 LOGDBG1(
" DataBlock %s, length %d at %lld\n",
name().c_str(), m_length,
54 (
long long int)m_start);
55 LOGDBG2(
"< DataBlock\n");
63 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
64 return mc->readInt8(mc->file());
71 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
72 return mc->readUInt8(mc->file());
79 mc->file()->seek(m_start + DataBlockHeaderLength + off, SEEK_SET);
84 DataBlock::string_val(off_t off)
89 s = mc->
fetchData(buf, m_start + DataBlockHeaderLength + off, 8);
99 MRWContainer::MRWContainer(
const IO::Stream::Ptr &_file, off_t _offset)
100 : IfdFileContainer(_file, _offset)
115 if ((p[0] == 0x00) && (p[1] ==
'M') && (p[2] ==
'R') && (p[3] ==
'M')) {
117 LOGDBG1(
"Identified MRW file\n");
122 LOGDBG1(
"Unidentified MRW file\n");
132 LOGDBG1(
"> MRWContainer::locateDirsPreHook()\n");
133 m_endian = ENDIAN_BIG;
136 mrm = std::make_shared<MRW::DataBlock>(m_offset,
this);
137 if (mrm->name() !=
"MRM") {
138 LOGWARN(
"MRW file begins not with MRM block, "
139 "but with unrecognized DataBlock :: name == %s\n",
140 mrm->name().c_str());
147 position = mrm->offset() + MRW::DataBlockHeaderLength;
148 while (position < pixelDataOffset()) {
149 auto ref = std::make_shared<MRW::DataBlock>(position,
this);
150 LOGDBG1(
"Loaded DataBlock :: name == %s\n", ref->name().c_str());
151 if (!ref || !ref->loaded()) {
154 if (ref->name() ==
"PRD") {
156 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
157 ref->name().c_str());
160 }
else if (ref->name() ==
"TTW") {
162 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
163 ref->name().c_str());
166 }
else if (ref->name() ==
"WBG") {
168 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
169 ref->name().c_str());
172 }
else if (ref->name() ==
"RIF") {
174 LOGWARN(
"File contains duplicate DataBlock :: name == %s\n",
175 ref->name().c_str());
178 }
else if (ref->name() !=
"PAD") {
179 LOGWARN(
"File contains unrecognized DataBlock :: name == %s\n",
180 ref->name().c_str());
182 position = ref->offset() + MRW::DataBlockHeaderLength + ref->length();
187 LOGWARN(
"File does NOT contain expected DataBlock :: name == PRD\n");
191 LOGWARN(
"File does NOT contain expected DataBlock :: name == TTW\n");
195 LOGWARN(
"File does NOT contain expected DataBlock :: name == WBG\n");
199 LOGWARN(
"File does NOT contain expected DataBlock :: name == RIF\n");
204 if (fetchData(version,
205 prd->offset() + MRW::DataBlockHeaderLength + MRW::PRD_VERSION,
208 LOGDBG1(
" Error reading version string\n");
211 m_version = std::string(version);
212 LOGDBG1(
" MRW file version == %s\n", m_version.c_str());
218 m_offset = ttw->offset() + MRW::DataBlockHeaderLength;
223 setExifOffsetCorrection(m_offset);
224 LOGDBG1(
"setting correction to %lld\n", (
long long int)m_offset);
227 m_file->seek(m_offset, SEEK_SET);
228 LOGDBG1(
"< MRWContainer\n");