22 #include <sys/types.h> 27 #include <libopenraw/debug.h> 30 #include "ifdfilecontainer.hpp" 32 using namespace Debug;
38 IfdFileContainer::IfdFileContainer(
const IO::Stream::Ptr &_file, off_t _offset)
41 , m_exif_offset_correction(0)
59 if ((p[0] == 0x49) && (p[1] == 0x49) && (p[2] == 0x2a) && (p[3] == 0x00)) {
61 }
else if ((p[0] == 0x4d) && (p[1] == 0x4d) && (p[2] == 0x00) &&
70 if (m_dirs.size() == 0) {
72 bool ret = _locateDirs();
82 if (m_dirs.size() == 0) {
102 if (dir > (
int)m_dirs.size()) {
104 return IfdDir::Ref();
106 m_current_dir = m_dirs[dir];
107 m_current_dir->load();
108 return m_current_dir;
114 Trace(DEBUG1) <<
"getDirectoryDataSize()" 116 off_t dir_offset = m_current_dir->offset();
118 Trace(DEBUG1) <<
"offset = " << dir_offset
119 <<
" m_numTags = " << m_current_dir->numTags() <<
"\n";
120 off_t begin = dir_offset + 2 + (m_current_dir->numTags() * 12);
122 Trace(DEBUG1) <<
"begin = " << begin <<
"\n";
124 m_file->seek(begin, SEEK_SET);
128 Trace(DEBUG1) <<
"nextIFD = " << nextIFD <<
"\n";
132 return nextIFD - begin;
140 bool IfdFileContainer::_locateDirs(
void)
145 Trace(DEBUG1) <<
"_locateDirs()\n";
146 if (m_endian == ENDIAN_NULL) {
151 if (m_endian == ENDIAN_NULL) {
157 int32_t dir_offset = 0;
161 if (dir_offset != 0) {
164 Trace(DEBUG1) <<
"push offset =0x" << dir_offset <<
"\n";
169 std::make_shared<IfdDir>(
m_offset + dir_offset, *
this));
170 m_dirs.push_back(dir);
175 dir_offset = dir->nextIFD();
177 }
while (dir_offset != 0);
179 Trace(DEBUG1) <<
"# dir found = " << m_dirs.size() <<
"\n";
180 return (m_dirs.size() != 0);
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
virtual bool locateDirsPreHook()
size_t getDirectoryDataSize()
IfdDir::Ref setDirectory(int dir)
virtual EndianType isMagicHeader(const char *p, int len)
std::vector< IfdDir::Ref > & directories()
int countDirectories(void)
bool readInt32(const IO::Stream::Ptr &f, int32_t &v)
virtual ~IfdFileContainer()