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()
63 IfdFileContainer * RafContainer::getCfaContainer()
69 if(m_offsetDirectory.cfaOffset && m_offsetDirectory.cfaLength) {
70 m_cfaContainer =
new IfdFileContainer(
71 std::make_shared<IO::StreamClone>(
72 m_file, m_offsetDirectory.cfaOffset), 0);
75 return m_cfaContainer;
78 JfifContainer * RafContainer::getJpegPreview()
84 if(m_offsetDirectory.jpegOffset && m_offsetDirectory.jpegLength) {
85 m_jpegPreview =
new JfifContainer(
86 std::make_shared<IO::StreamClone>(
87 m_file, m_offsetDirectory.jpegOffset), 0);
93 RafMetaContainer * RafContainer::getMetaContainer()
95 if(!m_metaContainer) {
99 if(m_offsetDirectory.metaOffset && m_offsetDirectory.metaLength) {
100 m_metaContainer =
new RafMetaContainer(
101 std::make_shared<IO::StreamClone>(
102 m_file, m_offsetDirectory.metaOffset));
105 return m_metaContainer;
108 bool RafContainer::_readHeader()
118 if(strncmp(magic, RAF_MAGIC, RAF_MAGIC_LEN) != 0) {
128 if (result.empty()) {
131 m_version = result.value();
133 m_file->seek(20, SEEK_CUR);
136 if (result.empty()) {
139 m_offsetDirectory.jpegOffset = result.value();
141 if (result.empty()) {
144 m_offsetDirectory.jpegLength = result.value();
146 if (result.empty()) {
149 m_offsetDirectory.metaOffset = result.value();
151 if (result.empty()) {
154 m_offsetDirectory.metaLength = result.value();
156 if (result.empty()) {
159 m_offsetDirectory.cfaOffset = result.value();
161 if (result.empty()) {
164 m_offsetDirectory.cfaLength = result.value();