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 auto result = readUInt32(m_file);
128 if (result.empty()) {
131 m_version = result.unwrap();
133 m_file->seek(20, SEEK_CUR);
135 result = readUInt32(m_file);
136 if (result.empty()) {
139 m_offsetDirectory.jpegOffset = result.unwrap();
140 result = readUInt32(m_file);
141 if (result.empty()) {
144 m_offsetDirectory.jpegLength = result.unwrap();
145 result = readUInt32(m_file);
146 if (result.empty()) {
149 m_offsetDirectory.metaOffset = result.unwrap();
150 result = readUInt32(m_file);
151 if (result.empty()) {
154 m_offsetDirectory.metaLength = result.unwrap();
155 result = readUInt32(m_file);
156 if (result.empty()) {
159 m_offsetDirectory.cfaOffset = result.unwrap();
160 result = readUInt32(m_file);
161 if (result.empty()) {
164 m_offsetDirectory.cfaLength = result.unwrap();
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.