27 #include <libopenraw/cameraids.h> 28 #include <libopenraw/consts.h> 29 #include <libopenraw/debug.h> 31 #include "rawdata.hpp" 32 #include "rawfile.hpp" 33 #include "cfapattern.hpp" 35 #include "io/memstream.hpp" 36 #include "ifdfilecontainer.hpp" 37 #include "ifdentry.hpp" 38 #include "makernotedir.hpp" 39 #include "cr2file.hpp" 40 #include "jfifcontainer.hpp" 41 #include "ljpegdecompressor.hpp" 42 #include "rawfile_private.hpp" 44 using namespace Debug;
50 #define OR_MAKE_CANON_TYPEID(camid) \ 51 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_CANON, camid) 55 static const BuiltinColourMatrix s_matrices[] = {
56 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKII),
59 { 6264, -582, -724, -8312, 15948, 2504, -1744, 1919, 8664 } },
60 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIII),
63 { 6291, -540, -976, -8350, 16145, 2311, -1714, 1858, 7326 } },
64 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIV),
67 { 6014, -220, -795, -4109, 12014, 2361, -561, 1824, 5787 } },
68 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKII),
71 { 6517, -602, -867, -8180, 15926, 2378, -1618, 1771, 7633 } },
72 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKIII),
75 { 5859, -211, -930, -8255, 16017, 2353, -1732, 1887, 7448 } },
76 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DX),
79 { 6847, -614, -1014, -4669, 12737, 2139, -1197, 2488, 6846 } },
80 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20D),
83 { 6599, -537, -891, -8071, 15783, 2424, -1983, 2234, 7462 } },
84 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20DA),
87 { 14155, -5065, -1382, -6550, 14633, 2039, -1623, 1824, 6561 } },
88 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_30D),
91 { 6257, -303, -1000, -7880, 15621, 2396, -1714, 1904, 7046 } },
92 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_350D),
95 { 6018, -617, -965, -8645, 15881, 2975, -1530, 1719, 7642 } },
96 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_40D),
99 { 6071, -747, -856, -7653, 15365, 2441, -2025, 2553, 7315 } },
100 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_400D),
103 { 7054, -1501, -990, -8156, 15544, 2812, -1278, 1414, 7796 } },
104 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_450D),
107 { 5784, -262, -821, -7539, 15064, 2672, -1982, 2681, 7427 } },
108 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_50D),
111 { 4920, 616, -593, -6493, 13964, 2784, -1774, 3178, 7005 } },
112 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_500D),
115 { 4763, 712, -646, -6821, 14399, 2640, -1921, 3276, 6561 } },
116 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_550D),
119 { 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 } },
120 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_600D),
123 { 6461, -907, -882, -4300, 12184, 2378, -819, 1944, 5931 } },
124 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_60D),
127 { 6719, -994, -925, -4408, 12426, 2211, -887, 2129, 6051 } },
128 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_650D),
131 { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
133 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_700D),
136 { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
137 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1000D),
140 { 6771, -1139, -977, -7818, 15123, 2928, -1244, 1437, 7533 } },
141 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1100D),
144 { 6444, -904, -893, -4563, 12308, 2535, -903, 2016, 6728 } },
146 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D),
149 { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
150 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5D),
153 { 6347, -479, -972, -8297, 15954, 2480, -1968, 2131, 7649 } },
154 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKII),
157 { 4716, 603, -830, -7798, 15474, 2480, -1496, 1937, 6651 } },
158 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIII),
161 { 6722, -635, -963, -4287, 12460, 2028, -908, 2162, 5668 } },
162 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6D),
165 { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
166 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7D),
169 { 6844, -996, -856, -3876, 11761, 2396, -593, 1772, 6198 } },
170 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7DMKII),
173 { 7268, -1082, -969, -4186, 11839, 2663, -825, 2029, 5839 } },
174 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_70D),
177 { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
178 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M),
181 { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
182 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9),
185 { 7368, -2141, -598, -5621, 13254, 2625, -1418, 1696, 5743 } },
186 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G10),
189 { 11093, -3906, -1028, -5047, 12492, 2879, -1003, 1750, 5561 } },
190 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G11),
193 { 12177, -4817, -1069, -1612, 9864, 2049, -98, 850, 4471 } },
194 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G12),
197 { 13244, -5501, -1248, -1508, 9858, 1935, -270, 1083, 4366 } },
198 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G15),
201 { 7474, -2301, -567, -4056, 11456, 2975, -222, 716, 4181 } },
203 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1X),
206 { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
208 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKII),
211 { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
212 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7X),
215 { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
216 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S90),
219 { 12374, -5016, -1049, -1677, 9902, 2078, -83, 852, 4683 } },
220 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S95),
223 { 13440, -5896, -1279, -1236, 9598, 1931, -180, 1001, 4651 } },
224 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S100),
227 { 7968, -2565, -636, -2873, 10697, 2513, 180, 667, 4211 } },
228 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S110),
231 { 8039, -2643, -654, -3783, 11230, 2930, -206, 690, 4194 } },
232 { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_SX50_HS),
235 { 12432, -4753, -1247, -2110, 10691, 1629, -412, 1623, 4926 } },
244 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
247 const IfdFile::camera_ids_t Cr2File::s_def[] = {
248 {
"Canon EOS-1D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKII) },
249 {
"Canon EOS-1D Mark III", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIII) },
250 {
"Canon EOS-1D Mark IV", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIV) },
251 {
"Canon EOS-1Ds Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKII) },
252 {
"Canon EOS-1Ds Mark III",
253 OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKIII) },
254 {
"Canon EOS-1D X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DX) },
255 {
"Canon EOS 20D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20D) },
256 {
"Canon EOS 20Da", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20DA) },
257 {
"Canon EOS 30D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_30D) },
258 {
"Canon EOS 350D DIGITAL", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_350D) },
259 {
"Canon EOS DIGITAL REBEL XT",
260 OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_XT) },
261 {
"Canon EOS 40D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_40D) },
262 {
"Canon EOS 400D DIGITAL", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_400D) },
263 {
"Canon EOS 450D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_450D) },
264 {
"Canon EOS 50D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_50D) },
265 {
"Canon EOS 500D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_500D) },
266 {
"Canon EOS 550D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_550D) },
267 {
"Canon EOS REBEL T2i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T2I) },
268 {
"Canon EOS 600D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_600D) },
269 {
"Canon EOS REBEL T3i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T3I) },
270 {
"Canon EOS 60D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_60D) },
271 {
"Canon EOS 650D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_650D) },
272 {
"Canon EOS REBEL T4i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T4I) },
273 {
"Canon EOS 70D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_70D) },
274 {
"Canon EOS 700D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_700D) },
275 {
"Canon EOS REBEL T5i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T5I) },
276 {
"Canon EOS Rebel T6i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T6I) },
277 {
"Canon EOS Rebel T6s", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T6S) },
278 {
"Canon EOS 1000D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1000D) },
279 {
"Canon EOS DIGITAL REBEL XS",
280 OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_XS) },
281 {
"Canon EOS 1100D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1100D) },
282 {
"Canon EOS REBEL T3", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T3) },
283 {
"Canon EOS 100D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D) },
284 {
"Canon EOS REBEL SL1", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_SL1) },
285 {
"Canon EOS 5D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5D) },
286 {
"Canon EOS 5D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKII) },
287 {
"Canon EOS 5D Mark III", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIII) },
288 {
"Canon EOS 5DS R", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DS_R) },
289 {
"Canon EOS 6D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6D) },
290 {
"Canon EOS 7D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7D) },
291 {
"Canon EOS 7D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7DMKII) },
292 {
"Canon EOS M", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M) },
293 {
"Canon PowerShot G9", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9) },
294 {
"Canon PowerShot G10", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G10) },
295 {
"Canon PowerShot G11", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G11) },
296 {
"Canon PowerShot G12", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G12) },
297 {
"Canon PowerShot G15", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G15) },
298 {
"Canon PowerShot G16", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G16) },
299 {
"Canon PowerShot G1 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1X) },
300 {
"Canon PowerShot G1 X Mark II",
301 OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKII) },
302 {
"Canon PowerShot G7 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7X) },
303 {
"Canon PowerShot S90", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S90) },
304 {
"Canon PowerShot S95", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S95) },
305 {
"Canon PowerShot S100", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S100) },
306 {
"Canon PowerShot S110", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S110) },
307 {
"Canon PowerShot SX50 HS",
308 OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_SX50_HS) },
309 {
"Canon PowerShot G3 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G3X) },
313 RawFile *Cr2File::factory(
const IO::Stream::Ptr &s)
315 return new Cr2File(s);
318 Cr2File::Cr2File(
const IO::Stream::Ptr &s) : IfdFile(s, OR_RAWFILE_TYPE_CR2)
321 _setMatrices(s_matrices);
328 IfdDir::Ref Cr2File::_locateCfaIfd()
330 return m_container->setDirectory(3);
333 IfdDir::Ref Cr2File::_locateMainIfd()
335 return m_container->setDirectory(0);
338 ::or_error Cr2File::_getRawData(RawData &data, uint32_t options)
340 const IfdDir::Ref &_cfaIfd = cfaIfd();
342 Trace(DEBUG1) <<
"cfa IFD not found\n";
343 return OR_ERROR_NOT_FOUND;
346 Trace(DEBUG1) <<
"_getRawData()\n";
348 uint32_t byte_length = 0;
350 got_it = _cfaIfd->getValue(IFD::EXIF_TAG_STRIP_OFFSETS, offset);
352 Trace(DEBUG1) <<
"offset not found\n";
353 return OR_ERROR_NOT_FOUND;
355 got_it = _cfaIfd->getValue(IFD::EXIF_TAG_STRIP_BYTE_COUNTS, byte_length);
357 Trace(DEBUG1) <<
"byte len not found\n";
358 return OR_ERROR_NOT_FOUND;
361 std::vector<uint16_t> slices;
365 Trace(DEBUG1) <<
"Found slice entry " << slices <<
"\n";
368 const IfdDir::Ref &_exifIfd = exifIfd();
370 Trace(ERROR) <<
"unable to find ExifIFD\n";
371 return OR_ERROR_NOT_FOUND;
377 got_it = _exifIfd->getValue(IFD::EXIF_TAG_PIXEL_X_DIMENSION, x);
379 Trace(DEBUG1) <<
"X not found\n";
380 return OR_ERROR_NOT_FOUND;
382 got_it = _exifIfd->getValue(IFD::EXIF_TAG_PIXEL_Y_DIMENSION, y);
384 Trace(DEBUG1) <<
"Y not found\n";
385 return OR_ERROR_NOT_FOUND;
388 void *p = data.allocData(byte_length);
389 size_t real_size = m_container->fetchData(p, offset, byte_length);
390 if (real_size < byte_length) {
391 Trace(WARNING) <<
"Size mismatch for data: ignoring.\n";
396 data.setCfaPatternType(OR_CFA_PATTERN_RGGB);
397 data.setDataType(OR_DATA_TYPE_COMPRESSED_RAW);
398 data.setDimensions(x, y);
400 Trace(DEBUG1) <<
"In size is " << data.width() <<
"x" << data.height()
403 if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
404 IO::Stream::Ptr s(
new IO::MemStream(data.data(), data.size()));
406 std::unique_ptr<JfifContainer> jfif(
new JfifContainer(s, 0));
407 LJpegDecompressor decomp(s.get(), jfif.get());
410 if (slices.size() > 1) {
411 decomp.setSlices(slices);
413 RawData *dData = decomp.decompress();
415 Trace(DEBUG1) <<
"Out size is " << dData->width() <<
"x" 416 << dData->height() <<
"\n";
418 dData->setCfaPatternType(data.cfaPattern()->patternType());
425 std::vector<uint16_t> sensorInfo;
426 const IfdDir::Ref &_makerNoteIfd = makerNoteIfd();
427 e = _makerNoteIfd->getEntry(IFD::MNOTE_CANON_SENSORINFO);
429 e->getArray(sensorInfo);
430 if (sensorInfo.size() > 8) {
431 uint32_t w = sensorInfo[7] - sensorInfo[5];
432 uint32_t h = sensorInfo[8] - sensorInfo[6];
433 data.setRoi(sensorInfo[5], sensorInfo[6], w, h);
436 LOGWARN(
"sensorInfo is too small: %lu - skipping.\n",
441 return OR_ERROR_NONE;
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
std::shared_ptr< IfdEntry > Ref