libopenraw
cr2file.cpp
1 /*
2  * libopenraw - cr2file.cpp
3  *
4  * Copyright (C) 2006-2016 Hubert Figuiere
5  * Copyright (C) 2008 Novell, Inc.
6  *
7  * This library is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation, either version 3 of
10  * the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library. If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <stddef.h>
23 #include <cstdint>
24 #include <vector>
25 #include <memory>
26 
27 #include <libopenraw/cameraids.h>
28 #include <libopenraw/consts.h>
29 #include <libopenraw/debug.h>
30 
31 #include "rawdata.hpp"
32 #include "rawfile.hpp"
33 #include "cfapattern.hpp"
34 #include "trace.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"
43 
44 using namespace Debug;
45 
46 namespace OpenRaw {
47 
48 namespace Internals {
49 
50 #define OR_MAKE_CANON_TYPEID(camid) \
51  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_CANON, camid)
52 
53 /* taken from dcraw, by default */
54 /* all relative to the D65 calibration illuminant */
55 static const BuiltinColourMatrix s_matrices[] = {
56  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKII),
57  0,
58  0xe80,
59  { 6264, -582, -724, -8312, 15948, 2504, -1744, 1919, 8664 } },
60  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIII),
61  0,
62  0xe80,
63  { 6291, -540, -976, -8350, 16145, 2311, -1714, 1858, 7326 } },
64  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIV),
65  0,
66  0x3bb0,
67  { 6014, -220, -795, -4109, 12014, 2361, -561, 1824, 5787 } },
68  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKII),
69  0,
70  0xe80,
71  { 6517, -602, -867, -8180, 15926, 2378, -1618, 1771, 7633 } },
72  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKIII),
73  0,
74  0x3bb0,
75  { 5859, -211, -930, -8255, 16017, 2353, -1732, 1887, 7448 } },
76  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DX),
77  0,
78  0x3c4e,
79  { 6847, -614, -1014, -4669, 12737, 2139, -1197, 2488, 6846 } },
80  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20D),
81  0,
82  0xfff,
83  { 6599, -537, -891, -8071, 15783, 2424, -1983, 2234, 7462 } },
84  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20DA),
85  0,
86  0,
87  { 14155, -5065, -1382, -6550, 14633, 2039, -1623, 1824, 6561 } },
88  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_30D),
89  0,
90  0,
91  { 6257, -303, -1000, -7880, 15621, 2396, -1714, 1904, 7046 } },
92  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_350D),
93  0,
94  0xfff,
95  { 6018, -617, -965, -8645, 15881, 2975, -1530, 1719, 7642 } },
96  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_40D),
97  0,
98  0x3f60,
99  { 6071, -747, -856, -7653, 15365, 2441, -2025, 2553, 7315 } },
100  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_400D),
101  0,
102  0xe8e,
103  { 7054, -1501, -990, -8156, 15544, 2812, -1278, 1414, 7796 } },
104  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_450D),
105  0,
106  0x390d,
107  { 5784, -262, -821, -7539, 15064, 2672, -1982, 2681, 7427 } },
108  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_50D),
109  0,
110  0x3d93,
111  { 4920, 616, -593, -6493, 13964, 2784, -1774, 3178, 7005 } },
112  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_500D),
113  0,
114  0x3479,
115  { 4763, 712, -646, -6821, 14399, 2640, -1921, 3276, 6561 } },
116  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_550D),
117  0,
118  0x3dd7,
119  { 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 } },
120  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_600D),
121  0,
122  0x3510,
123  { 6461, -907, -882, -4300, 12184, 2378, -819, 1944, 5931 } },
124  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_60D),
125  0,
126  0x2ff7,
127  { 6719, -994, -925, -4408, 12426, 2211, -887, 2129, 6051 } },
128  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_650D),
129  0,
130  0x354d,
131  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
132  // from DNG Convert 7.4
133  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_700D),
134  0,
135  0x3c00,
136  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
137  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1000D),
138  0,
139  0xe43,
140  { 6771, -1139, -977, -7818, 15123, 2928, -1244, 1437, 7533 } },
141  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1100D),
142  0,
143  0x3510,
144  { 6444, -904, -893, -4563, 12308, 2535, -903, 2016, 6728 } },
145  // from DNG Convert 7.4
146  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D),
147  0,
148  0x3806,
149  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
150  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5D),
151  0,
152  0xe6c,
153  { 6347, -479, -972, -8297, 15954, 2480, -1968, 2131, 7649 } },
154  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKII),
155  0,
156  0x3cf0,
157  { 4716, 603, -830, -7798, 15474, 2480, -1496, 1937, 6651 } },
158  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIII),
159  0,
160  0,
161  { 6722, -635, -963, -4287, 12460, 2028, -908, 2162, 5668 } },
162  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6D),
163  0,
164  0x3c82,
165  { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
166  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7D),
167  0,
168  0x3510,
169  { 6844, -996, -856, -3876, 11761, 2396, -593, 1772, 6198 } },
170  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7DMKII),
171  0,
172  0x3510,
173  { 7268, -1082, -969, -4186, 11839, 2663, -825, 2029, 5839 } },
174  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_70D),
175  0,
176  0x3bc7,
177  { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
178  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M),
179  0,
180  0,
181  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
182  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9),
183  0,
184  0,
185  { 7368, -2141, -598, -5621, 13254, 2625, -1418, 1696, 5743 } },
186  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G10),
187  0,
188  0,
189  { 11093, -3906, -1028, -5047, 12492, 2879, -1003, 1750, 5561 } },
190  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G11),
191  0,
192  0,
193  { 12177, -4817, -1069, -1612, 9864, 2049, -98, 850, 4471 } },
194  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G12),
195  0,
196  0,
197  { 13244, -5501, -1248, -1508, 9858, 1935, -270, 1083, 4366 } },
198  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G15),
199  0,
200  0,
201  { 7474, -2301, -567, -4056, 11456, 2975, -222, 716, 4181 } },
202  // From DNG Converter 7.1-rc
203  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1X),
204  0,
205  0,
206  { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
207  // From DNG Converter 8.7-rc
208  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKII),
209  0,
210  0,
211  { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
212  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7X),
213  0,
214  0,
215  { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
216  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S90),
217  0,
218  0,
219  { 12374, -5016, -1049, -1677, 9902, 2078, -83, 852, 4683 } },
220  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S95),
221  0,
222  0,
223  { 13440, -5896, -1279, -1236, 9598, 1931, -180, 1001, 4651 } },
224  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S100),
225  0,
226  0,
227  { 7968, -2565, -636, -2873, 10697, 2513, 180, 667, 4211 } },
228  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S110),
229  0,
230  0,
231  { 8039, -2643, -654, -3783, 11230, 2930, -206, 690, 4194 } },
232  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_SX50_HS),
233  0,
234  0,
235  { 12432, -4753, -1247, -2110, 10691, 1629, -412, 1623, 4926 } },
236  /*
237  { "Canon EOS-1D Mark II N", 0, 0xe80,
238  { 6240,-466,-822,-8180,15825,2500,-1801,1938,8042 } },
239  { "Canon EOS-1DS", 0, 0xe20,
240  { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } },
241  { "Canon EOS-1D", 0, 0xe20,
242  { 6806,-179,-1020,-8097,16415,1687,-3267,4236,7690 } },
243  */
244  { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
245 };
246 
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) },
310  { 0, 0 }
311 };
312 
313 RawFile *Cr2File::factory(const IO::Stream::Ptr &s)
314 {
315  return new Cr2File(s);
316 }
317 
318 Cr2File::Cr2File(const IO::Stream::Ptr &s) : IfdFile(s, OR_RAWFILE_TYPE_CR2)
319 {
320  _setIdMap(s_def);
321  _setMatrices(s_matrices);
322 }
323 
324 Cr2File::~Cr2File()
325 {
326 }
327 
328 IfdDir::Ref Cr2File::_locateCfaIfd()
329 {
330  return m_container->setDirectory(3);
331 }
332 
333 IfdDir::Ref Cr2File::_locateMainIfd()
334 {
335  return m_container->setDirectory(0);
336 }
337 
338 ::or_error Cr2File::_getRawData(RawData &data, uint32_t options)
339 {
340  const IfdDir::Ref &_cfaIfd = cfaIfd();
341  if (!_cfaIfd) {
342  Trace(DEBUG1) << "cfa IFD not found\n";
343  return OR_ERROR_NOT_FOUND;
344  }
345 
346  Trace(DEBUG1) << "_getRawData()\n";
347  uint32_t offset = 0;
348  uint32_t byte_length = 0;
349  bool got_it;
350  got_it = _cfaIfd->getValue(IFD::EXIF_TAG_STRIP_OFFSETS, offset);
351  if (!got_it) {
352  Trace(DEBUG1) << "offset not found\n";
353  return OR_ERROR_NOT_FOUND;
354  }
355  got_it = _cfaIfd->getValue(IFD::EXIF_TAG_STRIP_BYTE_COUNTS, byte_length);
356  if (!got_it) {
357  Trace(DEBUG1) << "byte len not found\n";
358  return OR_ERROR_NOT_FOUND;
359  }
360  // get the "slicing", tag 0xc640 (3 SHORT)
361  std::vector<uint16_t> slices;
362  IfdEntry::Ref e = _cfaIfd->getEntry(IFD::CR2_TAG_SLICE);
363  if (e) {
364  e->getArray(slices);
365  Trace(DEBUG1) << "Found slice entry " << slices << "\n";
366  }
367 
368  const IfdDir::Ref &_exifIfd = exifIfd();
369  if (!_exifIfd) {
370  Trace(ERROR) << "unable to find ExifIFD\n";
371  return OR_ERROR_NOT_FOUND;
372  }
373 
374  uint16_t x, y;
375  x = 0;
376  y = 0;
377  got_it = _exifIfd->getValue(IFD::EXIF_TAG_PIXEL_X_DIMENSION, x);
378  if (!got_it) {
379  Trace(DEBUG1) << "X not found\n";
380  return OR_ERROR_NOT_FOUND;
381  }
382  got_it = _exifIfd->getValue(IFD::EXIF_TAG_PIXEL_Y_DIMENSION, y);
383  if (!got_it) {
384  Trace(DEBUG1) << "Y not found\n";
385  return OR_ERROR_NOT_FOUND;
386  }
387 
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";
392  }
393  // they are not all RGGB.
394  // but I don't seem to see where this is encoded.
395  //
396  data.setCfaPatternType(OR_CFA_PATTERN_RGGB);
397  data.setDataType(OR_DATA_TYPE_COMPRESSED_RAW);
398  data.setDimensions(x, y);
399 
400  Trace(DEBUG1) << "In size is " << data.width() << "x" << data.height()
401  << "\n";
402  // decompress if we need
403  if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
404  IO::Stream::Ptr s(new IO::MemStream(data.data(), data.size()));
405  s->open(); // TODO check success
406  std::unique_ptr<JfifContainer> jfif(new JfifContainer(s, 0));
407  LJpegDecompressor decomp(s.get(), jfif.get());
408  // in fact on Canon CR2 files slices either do not exists
409  // or is 3.
410  if (slices.size() > 1) {
411  decomp.setSlices(slices);
412  }
413  RawData *dData = decomp.decompress();
414  if (dData != NULL) {
415  Trace(DEBUG1) << "Out size is " << dData->width() << "x"
416  << dData->height() << "\n";
417  // must re-set the cfaPattern
418  dData->setCfaPatternType(data.cfaPattern()->patternType());
419  data.swap(*dData);
420  delete dData;
421  }
422  }
423 
424  // get the sensor info
425  std::vector<uint16_t> sensorInfo;
426  const IfdDir::Ref &_makerNoteIfd = makerNoteIfd();
427  e = _makerNoteIfd->getEntry(IFD::MNOTE_CANON_SENSORINFO);
428  if (e) {
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);
434  }
435  else {
436  LOGWARN("sensorInfo is too small: %lu - skipping.\n",
437  sensorInfo.size());
438  }
439  }
440 
441  return OR_ERROR_NONE;
442 }
443 }
444 }
445 
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
Definition: arwfile.cpp:30
std::shared_ptr< IfdEntry > Ref
Definition: ifdentry.hpp:178
Definition: trace.cpp:30