26 #include "rafcontainer.hpp" 27 #include "raffile.hpp" 28 #include "jfifcontainer.hpp" 29 #include "ifdfilecontainer.hpp" 30 #include "rafmetacontainer.hpp" 31 #include "io/stream.hpp" 32 #include "io/streamclone.hpp" 37 RafContainer::RafContainer(
const IO::Stream::Ptr &_file)
38 : RawContainer(_file, 0)
41 , m_jpegPreview(nullptr)
42 , m_cfaContainer(nullptr)
43 , m_metaContainer(nullptr)
45 memset((
void*)&m_offsetDirectory, 0,
sizeof(m_offsetDirectory));
51 delete m_cfaContainer;
52 delete m_metaContainer;
55 const std::string & RafContainer::getModel()
69 if(m_offsetDirectory.cfaOffset && m_offsetDirectory.cfaLength) {
71 std::make_shared<IO::StreamClone>(
72 m_file, m_offsetDirectory.cfaOffset), 0);
75 return m_cfaContainer;
84 if(m_offsetDirectory.jpegOffset && m_offsetDirectory.jpegLength) {
86 std::make_shared<IO::StreamClone>(
87 m_file, m_offsetDirectory.jpegOffset), 0);
95 if(!m_metaContainer) {
99 if(m_offsetDirectory.metaOffset && m_offsetDirectory.metaLength) {
101 std::make_shared<IO::StreamClone>(
102 m_file, m_offsetDirectory.metaOffset));
105 return m_metaContainer;
108 bool RafContainer::_readHeader()
116 m_file->read(magic, 28);
118 if(strncmp(magic, RAF_MAGIC, RAF_MAGIC_LEN) != 0) {
123 setEndian(ENDIAN_BIG);
125 m_file->read(model, 32);
127 readUInt32(m_file, m_version);
128 m_file->seek(20, SEEK_CUR);
129 readUInt32(m_file, m_offsetDirectory.jpegOffset);
130 readUInt32(m_file, m_offsetDirectory.jpegLength);
131 readUInt32(m_file, m_offsetDirectory.metaOffset);
132 readUInt32(m_file, m_offsetDirectory.metaLength);
133 readUInt32(m_file, m_offsetDirectory.cfaOffset);
134 readUInt32(m_file, m_offsetDirectory.cfaLength);
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.