22 #include <sys/types.h> 28 #include <libopenraw/cameraids.h> 29 #include <libopenraw/debug.h> 30 #include <libopenraw/metadata.h> 32 #include "rawdata.hpp" 33 #include "rawfile.hpp" 34 #include "metavalue.hpp" 38 #include "ifdentry.hpp" 39 #include "rawfile_private.hpp" 40 #include "raffile.hpp" 41 #include "rafcontainer.hpp" 42 #include "rafmetacontainer.hpp" 43 #include "jfifcontainer.hpp" 46 #include "io/streamclone.hpp" 47 #include "xtranspattern.hpp" 52 #define OR_MAKE_FUJIFILM_TYPEID(camid) \ 53 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_FUJIFILM, camid) 56 static const BuiltinColourMatrix s_matrices[] = {
57 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F700),
60 { 10004, -3219, -1201, -7036, 15047, 2107, -1863, 2565, 7736 } },
61 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F810),
64 { 11044, -3888, -1120, -7248, 15168, 2208, -1531, 2277, 8069 } },
65 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_E900),
68 { 9183, -2526, -1078, -7461, 15071, 2574, -2022, 2440, 8639 } },
69 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S2PRO),
72 { 12492, -4690, -1402, -7033, 15423, 1647, -1507, 2111, 7697 } },
73 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S3PRO),
76 { 11807, -4612, -1294, -8927, 16968, 1988, -2120, 2741, 8006 } },
77 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5PRO),
80 { 12300, -5110, -1304, -9117, 17143, 1998, -1947, 2448, 8100 } },
81 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5600),
84 { 9636, -2804, -988, -7442, 15040, 2589, -1803, 2311, 8621 } },
85 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S9500),
88 { 10491, -3423, -1145, -7385, 15027, 2538, -1809, 2275, 8692 } },
89 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6500FD),
92 { 12628, -4887, -1401, -6861, 14996, 1962, -2198, 2782, 7091 } },
93 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS10),
96 { 12440, -3954, -1183, -1123, 9674, 1708, -83, 1614, 4086 } },
97 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100),
100 { 12161, -4457, -1069, -5034, 12874, 2400, -795, 1724, 6904 } },
102 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S),
105 { 10592, -4262, -1008, -3514, 11355, 2465, -870, 2025, 6386 } },
106 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X10),
109 { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
111 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20),
114 { 11768, -4971, -1133, -4904, 12927, 2183, -480, 1723, 4605 } },
116 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30),
119 { 12328, -5256, -1144, -4469, 12927, 1675, -87, 1291, 4351 } },
120 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1),
123 { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
124 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1),
127 { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
128 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2),
131 { 8458, -2451, -855, -4597, 12447, 2407, -1475, 2482, 6526 } },
132 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1),
135 { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
136 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1),
139 { 8458, -2451, -855, -4597, 12447, 2407, -1475, 2482, 6526 } },
141 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS1),
144 { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
145 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF1),
148 { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
149 { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S200EXR),
152 { 11401, -4498, -1312, -5088, 12751, 2613, -838, 1568, 5941 } },
154 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
157 const RawFile::camera_ids_t RafFile::s_def[] = {
158 {
"FinePix F700 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F700) },
159 {
"FinePix F810 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F810) },
160 {
"FinePix E900 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_E900) },
161 {
"FinePixS2Pro", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S2PRO) },
162 {
"FinePix S3Pro ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S3PRO) },
163 {
"FinePix S5Pro ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5PRO) },
164 {
"FinePix S5600 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5600) },
165 {
"FinePix S9500 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S9500) },
166 {
"FinePix S6500fd", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6500FD) },
167 {
"FinePix HS10 HS11", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS10) },
168 {
"FinePix X100", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100) },
169 {
"X10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X10) },
170 {
"X20", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20) },
171 {
"X30", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30) },
172 {
"X-Pro1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1) },
173 {
"X-S1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS1) },
174 {
"FinePix S200EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S200EXR) },
175 {
"X-A1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA1) },
176 {
"XQ1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ1) },
177 {
"X-E1 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1) },
178 {
"X-E2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2) },
179 {
"X-M1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1) },
180 {
"X-T1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1) },
181 {
"X-T10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT10) },
182 {
"XF1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF1) },
183 {
"X100S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S) },
184 {
"X100T", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100T) },
188 RawFile *RafFile::factory(
const IO::Stream::Ptr &s)
190 return new RafFile(s);
193 RafFile::RafFile(
const IO::Stream::Ptr &s)
194 : RawFile(OR_RAWFILE_TYPE_RAF), m_io(s), m_container(new RafContainer(s))
197 _setMatrices(s_matrices);
207 or_error ret = OR_ERROR_NOT_FOUND;
215 if (jpegPreview->getDimensions(x, y)) {
216 uint32_t size = std::max(x, y);
218 list.push_back(size);
219 _addThumbnail(size,
ThumbDesc(x, y, OR_DATA_TYPE_JPEG,
220 m_container->getJpegOffset(),
221 m_container->getJpegLength()));
229 bool got_it = dir->getIntegerValue(IFD::EXIF_TAG_IMAGE_WIDTH, x);
232 got_it = dir->getIntegerValue(IFD::EXIF_TAG_IMAGE_LENGTH, y);
236 uint32_t jpeg_offset = 0;
237 uint32_t jpeg_size = 0;
239 dir->getValue(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT, jpeg_offset);
247 got_it = dir->getValue(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH,
254 IO::Stream::Ptr s(std::make_shared<IO::StreamClone>(jpegPreview->file(),
256 std::unique_ptr<JfifContainer> thumb(
new JfifContainer(s, 0));
258 if (thumb->getDimensions(x, y)) {
259 uint32_t size = std::max(x, y);
261 list.push_back(size);
264 jpeg_offset + m_container->getJpegOffset(),
280 ::or_error ret = OR_ERROR_NOT_FOUND;
284 RafMetaValue::Ref value = meta->getValue(RAF_TAG_SENSOR_DIMENSION);
287 value = meta->getValue(RAF_TAG_IMG_HEIGHT_WIDTH);
289 uint32_t dims = value->get().getInteger(0);
290 uint16_t h = (dims & 0xFFFF0000) >> 16;
291 uint16_t w = (dims & 0x0000FFFF);
293 value = meta->getValue(RAF_TAG_RAW_INFO);
294 uint32_t rawProps = value->get().getInteger(0);
297 uint8_t compressed = ((rawProps & 0xFF0000) >> 16) & 8;
304 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1):
305 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1):
306 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2):
307 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1):
308 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ1):
309 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1):
310 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT10):
311 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S):
312 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100T):
313 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20):
314 case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30):
315 data.setCfaPattern(XTransPattern::xtransPattern());
319 data.setCfaPatternType(OR_CFA_PATTERN_GBRG);
323 size_t byte_size = m_container->getCfaLength() - 2048;
325 off_t offset = m_container->getCfaOffset() + 2048;
327 uint32_t finaldatalen = 2 * h * w;
328 bool is_compressed = byte_size < finaldatalen;
329 uint32_t datalen = (is_compressed ? byte_size : finaldatalen);
330 void *buf = data.allocData(finaldatalen);
333 <<
" finaldatalen = " << finaldatalen
334 <<
" compressed = " << compressed <<
"\n";
339 Unpack unpack(w, IFD::COMPRESS_NONE);
340 size_t blocksize = unpack.block_size();
341 std::unique_ptr<uint8_t[]> block(
new uint8_t[blocksize]);
342 uint8_t *outdata = (uint8_t *)data.data();
343 size_t outsize = finaldatalen;
348 got = m_container->fetchData(block.get(), offset, blocksize);
355 block.get(), got, out);
360 if (err != OR_ERROR_NONE) {
370 }
while ((got != 0) && (fetched < datalen));
372 m_container->fetchData(buf, offset, datalen);
378 MetaValue *RafFile::_getMetaValue(int32_t meta_index)
380 if (META_INDEX_MASKOUT(meta_index) == META_NS_EXIF ||
381 META_INDEX_MASKOUT(meta_index) == META_NS_TIFF) {
384 IfdDir::Ref dir = jpegPreview->
mainIfd();
385 IfdEntry::Ref e = dir->getEntry(META_NS_MASKOUT(meta_index));
387 return e->make_meta_value();
394 void RafFile::_identifyId()
396 _setTypeId(_typeIdFromModel(
"FujiFilm", m_container->getModel()));
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
or_error unpack_be12to16(uint8_t *dest, size_t destsize, const uint8_t *src, size_t size, size_t &outsize)
virtual ::or_error _getRawData(RawData &data, uint32_t options) override
IfdDir::Ref getIfdDirAt(int idx)
std::shared_ptr< IfdEntry > Ref
virtual RawContainer * getContainer() const override
void setDataType(DataType _type)
virtual ::or_error _enumThumbnailSizes(std::vector< uint32_t > &list) override
virtual void setDimensions(uint32_t x, uint32_t y) override