libopenraw
cr2file.cpp
1 /* -*- mode:c++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil; -*- */
2 /*
3  * libopenraw - cr2file.cpp
4  *
5  * Copyright (C) 2006-2018 Hubert Figuière
6  * Copyright (C) 2008 Novell, Inc.
7  *
8  * This library is free software: you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation, either version 3 of
11  * the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library. If not, see
20  * <http://www.gnu.org/licenses/>.
21  */
22 
23 #include <stddef.h>
24 #include <cstdint>
25 #include <vector>
26 #include <memory>
27 
28 #include <libopenraw/cameraids.h>
29 #include <libopenraw/consts.h>
30 #include <libopenraw/debug.h>
31 
32 #include "rawdata.hpp"
33 #include "rawfile.hpp"
34 #include "cfapattern.hpp"
35 #include "trace.hpp"
36 #include "io/memstream.hpp"
37 #include "ifdfilecontainer.hpp"
38 #include "ifdentry.hpp"
39 #include "makernotedir.hpp"
40 #include "cr2file.hpp"
41 #include "jfifcontainer.hpp"
42 #include "ljpegdecompressor.hpp"
43 #include "rawfile_private.hpp"
44 
45 using namespace Debug;
46 
47 namespace OpenRaw {
48 
49 namespace Internals {
50 
51 #define OR_MAKE_CANON_TYPEID(camid) \
52  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_CANON, camid)
53 
54 /* taken from dcraw, by default */
55 /* all relative to the D65 calibration illuminant */
56 static const BuiltinColourMatrix s_matrices[] = {
57  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKII),
58  0,
59  0xe80,
60  { 6264, -582, -724, -8312, 15948, 2504, -1744, 1919, 8664 } },
61  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIII),
62  0,
63  0xe80,
64  { 6291, -540, -976, -8350, 16145, 2311, -1714, 1858, 7326 } },
65  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIV),
66  0,
67  0x3bb0,
68  { 6014, -220, -795, -4109, 12014, 2361, -561, 1824, 5787 } },
69  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKII),
70  0,
71  0xe80,
72  { 6517, -602, -867, -8180, 15926, 2378, -1618, 1771, 7633 } },
73  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKIII),
74  0,
75  0x3bb0,
76  { 5859, -211, -930, -8255, 16017, 2353, -1732, 1887, 7448 } },
77  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DX),
78  0,
79  0x3c4e,
80  { 6847, -614, -1014, -4669, 12737, 2139, -1197, 2488, 6846 } },
81  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DXMKII),
82  0,
83  0x3c4e,
84  { 7596, -978, -967, -4808, 12571, 2503, -1398, 2567, 5752 } },
85  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20D),
86  0,
87  0xfff,
88  { 6599, -537, -891, -8071, 15783, 2424, -1983, 2234, 7462 } },
89  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20DA),
90  0,
91  0,
92  { 14155, -5065, -1382, -6550, 14633, 2039, -1623, 1824, 6561 } },
93  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_30D),
94  0,
95  0,
96  { 6257, -303, -1000, -7880, 15621, 2396, -1714, 1904, 7046 } },
97  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_350D),
98  0,
99  0xfff,
100  { 6018, -617, -965, -8645, 15881, 2975, -1530, 1719, 7642 } },
101  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_40D),
102  0,
103  0x3f60,
104  { 6071, -747, -856, -7653, 15365, 2441, -2025, 2553, 7315 } },
105  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_400D),
106  0,
107  0xe8e,
108  { 7054, -1501, -990, -8156, 15544, 2812, -1278, 1414, 7796 } },
109  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_450D),
110  0,
111  0x390d,
112  { 5784, -262, -821, -7539, 15064, 2672, -1982, 2681, 7427 } },
113  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_50D),
114  0,
115  0x3d93,
116  { 4920, 616, -593, -6493, 13964, 2784, -1774, 3178, 7005 } },
117  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_500D),
118  0,
119  0x3479,
120  { 4763, 712, -646, -6821, 14399, 2640, -1921, 3276, 6561 } },
121  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_550D),
122  0,
123  0x3dd7,
124  { 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 } },
125  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_600D),
126  0,
127  0x3510,
128  { 6461, -907, -882, -4300, 12184, 2378, -819, 1944, 5931 } },
129  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_60D),
130  0,
131  0x2ff7,
132  { 6719, -994, -925, -4408, 12426, 2211, -887, 2129, 6051 } },
133  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_650D),
134  0,
135  0x354d,
136  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
137  // from DNG Convert 7.4
138  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_700D),
139  0,
140  0x3c00,
141  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
142  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_80D),
143  0,
144  0,
145  { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } },
146  // From DNG Converter 10.3
147  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_800D),
148  0,
149  0,
150  { 6970, -512, -968, -4425, 12161, 2553, -739, 1982, 5601 } },
151  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D),
152  0,
153  0x350f,
154  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
155  // From DNG Converter 10.3
156  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_200D),
157  0,
158  0x350f,
159  { 7377, -742, -998, -4235, 11981, 2549, -673, 1918, 5538 } },
160  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1000D),
161  0,
162  0xe43,
163  { 6771, -1139, -977, -7818, 15123, 2928, -1244, 1437, 7533 } },
164  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1100D),
165  0,
166  0x3510,
167  { 6444, -904, -893, -4563, 12308, 2535, -903, 2016, 6728 } },
168  // from DNG Convert 7.4
169  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D),
170  0,
171  0x3806,
172  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
173  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1200D), // Rebel T5
174  0,
175  0x37c2,
176  { 6461, -907, -882, -4300, 12184, 2378, -819, 1944, 5931 } },
177  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1300D), // Rebel T6
178  0,
179  0x3510,
180  { 6939, -1016, -866, -4428, 12473, 2177, -1175, 2178, 6162 } },
181  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5D),
182  0,
183  0xe6c,
184  { 6347, -479, -972, -8297, 15954, 2480, -1968, 2131, 7649 } },
185  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKII),
186  0,
187  0x3cf0,
188  { 4716, 603, -830, -7798, 15474, 2480, -1496, 1937, 6651 } },
189  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIII),
190  0,
191  0,
192  { 6722, -635, -963, -4287, 12460, 2028, -908, 2162, 5668 } },
193  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIV),
194  0,
195  0x3bb0,
196  { 6014, -220, -795, -4109, 12014, 2361, -561, 1824, 5787 } },
197  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DS),
198  0,
199  0xe6c,
200  { 6250, -711, -808, -5153, 12794, 2636, -1249, 2198, 5610 } },
201  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DS_R),
202  0,
203  0xe6c,
204  { 6250, -711, -808, -5153, 12794, 2636, -1249, 2198, 5610 } },
205  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6D),
206  0,
207  0x3c82,
208  { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
209  // From DNG Converter 10.3
210  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6DMKII),
211  0,
212  0,
213  { 6875, -970, -932, -4691, 12459, 2501, -874, 1953, 5809 } },
214  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7D),
215  0,
216  0x3510,
217  { 6844, -996, -856, -3876, 11761, 2396, -593, 1772, 6198 } },
218  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7DMKII),
219  0,
220  0x3510,
221  { 7268, -1082, -969, -4186, 11839, 2663, -825, 2029, 5839 } },
222  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_70D),
223  0,
224  0x3bc7,
225  { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } },
226  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_750D),
227  0,
228  0x368e,
229  { 6362, -823, -847, -4426, 12109, 2616, -743, 1857, 5635 } },
230  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_760D),
231  0,
232  0x350f,
233  { 6362, -823, -847, -4426, 12109, 2616, -743, 1857, 5635 } },
234  // Fron DNG Converter 10.3
235  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_77D),
236  0,
237  0,
238  { 7377, -742, -998, -4235, 11981, 2549, -673, 1918, 5538 } },
239  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M),
240  0,
241  0,
242  { 6602, -841, -939, -4472, 12458, 2247, -975, 2039, 6148 } },
243  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M3),
244  0,
245  0,
246  { 6362, -823, -847, -4426, 12109, 2616, -743, 1857, 5635 } },
247  // From DNG Converter 10.3
248  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M5),
249  0,
250  0,
251  { 8532, -701, -1167, -4095, 11879, 2508, -797, 2424, 7010 } },
252  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M10),
253  0,
254  0,
255  { 6400, -480, -888, -5294, 13416, 2047, -1296, 2203, 6137 } },
256  // From DNG Converter 10.3
257  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M100),
258  0,
259  0,
260  { 8532, -701, -1167, -4095, 11879, 2508, -797, 2424, 7010 } },
261  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9),
262  0,
263  0,
264  { 7368, -2141, -598, -5621, 13254, 2625, -1418, 1696, 5743 } },
265  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G10),
266  0,
267  0,
268  { 11093, -3906, -1028, -5047, 12492, 2879, -1003, 1750, 5561 } },
269  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G11),
270  0,
271  0,
272  { 12177, -4817, -1069, -1612, 9864, 2049, -98, 850, 4471 } },
273  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G12),
274  0,
275  0,
276  { 13244, -5501, -1248, -1508, 9858, 1935, -270, 1083, 4366 } },
277  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G15),
278  0,
279  0,
280  { 7474, -2301, -567, -4056, 11456, 2975, -222, 716, 4181 } },
281  // From DNG Converter 7.1-rc
282  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1X),
283  0,
284  0,
285  { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
286  // From DNG Converter 8.7-rc
287  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKII),
288  0,
289  0,
290  { 7378, -1255, -1043, -4088, 12251, 2048, -876, 1946, 5805 } },
291  // From DNG Converter 10.3
292  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKIII),
293  0,
294  0,
295  { 8532, -701, -1167, -4095, 11879, 2508, -797, 2424, 7010 } },
296  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G3X),
297  0,
298  0,
299  { 9701, -3857, -921, -3149, 11537, 1817, -786, 1817, 5147 } },
300  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G5X),
301  0,
302  0,
303  { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
304  // From DNG Converter 10.3
305  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7X),
306  0,
307  0,
308  { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
309  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7XMKII),
310  0,
311  0,
312  { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
313  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9X),
314  0,
315  0,
316  { 9602, -3823, -937, -2984, 11495, 1675, -407, 1415, 5049 } },
317  // From DNG Converter 10.3
318  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9XMKII),
319  0,
320  0,
321  { 10056, -4131, -944, -2576, 11143, 1625, -238, 1294, 5179} },
322  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S90),
323  0,
324  0,
325  { 12374, -5016, -1049, -1677, 9902, 2078, -83, 852, 4683 } },
326  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S95),
327  0,
328  0,
329  { 13440, -5896, -1279, -1236, 9598, 1931, -180, 1001, 4651 } },
330  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S100),
331  0,
332  0,
333  { 7968, -2565, -636, -2873, 10697, 2513, 180, 667, 4211 } },
334  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S110),
335  0,
336  0,
337  { 8039, -2643, -654, -3783, 11230, 2930, -206, 690, 4194 } },
338  { OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_SX50_HS),
339  0,
340  0,
341  { 12432, -4753, -1247, -2110, 10691, 1629, -412, 1623, 4926 } },
342  /*
343  { "Canon EOS-1D Mark II N", 0, 0xe80,
344  { 6240,-466,-822,-8180,15825,2500,-1801,1938,8042 } },
345  { "Canon EOS-1DS", 0, 0xe20,
346  { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } },
347  { "Canon EOS-1D", 0, 0xe20,
348  { 6806,-179,-1020,-8097,16415,1687,-3267,4236,7690 } },
349  */
350  { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
351 };
352 
353 const IfdFile::camera_ids_t Cr2File::s_def[] = {
354  { "Canon EOS-1D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKII) },
355  { "Canon EOS-1D Mark III", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIII) },
356  { "Canon EOS-1D Mark IV", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DMKIV) },
357  { "Canon EOS-1Ds Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKII) },
358  { "Canon EOS-1Ds Mark III",
359  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DSMKIII) },
360  { "Canon EOS-1D X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DX) },
361  { "Canon EOS-1D X Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1DXMKII) },
362  { "Canon EOS 20D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20D) },
363  { "Canon EOS 20Da", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_20DA) },
364  { "Canon EOS 30D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_30D) },
365  { "Canon EOS 350D DIGITAL", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_350D) },
366  { "Canon EOS DIGITAL REBEL XT",
367  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_XT) },
368  { "Canon EOS Kiss Digital N", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_KISS_DIGITAL_N) },
369  { "Canon EOS 40D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_40D) },
370  { "Canon EOS 400D DIGITAL", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_400D) },
371  { "Canon EOS 450D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_450D) },
372  { "Canon EOS DIGITAL REBEL XSi", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_XSI) },
373  { "Canon EOS 50D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_50D) },
374  { "Canon EOS 500D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_500D) },
375  { "Canon EOS 550D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_550D) },
376  { "Canon EOS REBEL T2i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T2I) },
377  { "Canon EOS 600D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_600D) },
378  { "Canon EOS REBEL T3i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T3I) },
379  { "Canon EOS 60D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_60D) },
380  { "Canon EOS 650D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_650D) },
381  { "Canon EOS REBEL T4i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T4I) },
382  { "Canon EOS 70D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_70D) },
383  { "Canon EOS 700D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_700D) },
384  { "Canon EOS 750D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_750D) },
385  { "Canon EOS 760D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_760D) },
386  { "Canon EOS 80D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_80D) },
387  { "Canon EOS 800D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_800D) },
388  { "Canon EOS REBEL T1i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T1I) },
389  { "Canon EOS Rebel T5", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T5) },
390  { "Canon EOS REBEL T5i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T5I) },
391  { "Canon EOS Rebel T6i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T6I) },
392  { "Canon EOS Rebel T6s", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T6S) },
393  { "Canon EOS Rebel T6", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T6) },
394  { "Canon EOS Rebel T7i", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T7I) },
395  { "Canon EOS 1000D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1000D) },
396  { "Canon EOS DIGITAL REBEL XS",
397  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_XS) },
398  { "Canon EOS 1100D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1100D) },
399  { "Canon EOS 1200D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1200D) },
400  { "Canon EOS 1300D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_1300D) },
401  { "Canon EOS REBEL T3", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_T3) },
402  { "Canon EOS 100D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_100D) },
403  { "Canon EOS REBEL SL1", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_SL1) },
404  { "Canon EOS 200D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_200D) },
405  { "Canon EOS Rebel SL2", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_REBEL_SL2) },
406  { "Canon EOS 5D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5D) },
407  { "Canon EOS 5D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKII) },
408  { "Canon EOS 5D Mark III", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIII) },
409  { "Canon EOS 5D Mark IV", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DMKIV) },
410  { "Canon EOS 5DS", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DS) },
411  { "Canon EOS 5DS R", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_5DS_R) },
412  { "Canon EOS 6D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6D) },
413  { "Canon EOS 6D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_6DMKII) },
414  { "Canon EOS 7D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7D) },
415  { "Canon EOS 7D Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_7DMKII) },
416  { "Canon EOS 77D", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_77D) },
417  { "Canon EOS Kiss X3", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_KISS_X3) },
418  { "Canon EOS M", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M) },
419  { "Canon EOS M10", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M10) },
420  { "Canon EOS M100", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M100) },
421  { "Canon EOS M3", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M3) },
422  { "Canon EOS M5", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M5) },
423  { "Canon EOS M6", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_EOS_M6) },
424  { "Canon PowerShot G9", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9) },
425  { "Canon PowerShot G10", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G10) },
426  { "Canon PowerShot G11", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G11) },
427  { "Canon PowerShot G12", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G12) },
428  { "Canon PowerShot G15", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G15) },
429  { "Canon PowerShot G16", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G16) },
430  { "Canon PowerShot G1 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1X) },
431  { "Canon PowerShot G1 X Mark II",
432  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKII) },
433  { "Canon PowerShot G1 X Mark III",
434  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G1XMKIII) },
435  { "Canon PowerShot G3 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G3X) },
436  { "Canon PowerShot G5 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G5X) },
437  { "Canon PowerShot G7 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7X) },
438  { "Canon PowerShot G7 X Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G7XMKII) },
439  { "Canon PowerShot G9 X", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9X) },
440  { "Canon PowerShot G9 X Mark II", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_G9XMKII) },
441  { "Canon PowerShot S90", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S90) },
442  { "Canon PowerShot S95", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S95) },
443  { "Canon PowerShot S100", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S100) },
444  { "Canon PowerShot S110", OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_S110) },
445  { "Canon PowerShot SX50 HS",
446  OR_MAKE_CANON_TYPEID(OR_TYPEID_CANON_SX50_HS) },
447  { 0, 0 }
448 };
449 
450 RawFile *Cr2File::factory(const IO::Stream::Ptr &s)
451 {
452  return new Cr2File(s);
453 }
454 
455 Cr2File::Cr2File(const IO::Stream::Ptr &s) : IfdFile(s, OR_RAWFILE_TYPE_CR2)
456 {
457  _setIdMap(s_def);
458  _setMatrices(s_matrices);
459 }
460 
461 Cr2File::~Cr2File()
462 {
463 }
464 
465 IfdDir::Ref Cr2File::_locateCfaIfd()
466 {
467  return m_container->setDirectory(3);
468 }
469 
470 IfdDir::Ref Cr2File::_locateMainIfd()
471 {
472  return m_container->setDirectory(0);
473 }
474 
475 ::or_error Cr2File::_getRawData(RawData &data, uint32_t options)
476 {
477  const IfdDir::Ref &_cfaIfd = cfaIfd();
478  if (!_cfaIfd) {
479  LOGDBG1("cfa IFD not found\n");
480  return OR_ERROR_NOT_FOUND;
481  }
482 
483  LOGDBG1("_getRawData()\n");
484 
485  auto result = _cfaIfd->getValue<uint32_t>(IFD::EXIF_TAG_STRIP_OFFSETS);
486  if (result.empty()) {
487  LOGDBG1("offset not found\n");
488  return OR_ERROR_NOT_FOUND;
489  }
490  uint32_t offset = result.value();
491 
492  result = _cfaIfd->getValue<uint32_t>(IFD::EXIF_TAG_STRIP_BYTE_COUNTS);
493  if (result.empty()) {
494  LOGDBG1("byte len not found\n");
495  return OR_ERROR_NOT_FOUND;
496  }
497  uint32_t byte_length = result.value();
498 
499  // get the "slicing", tag 0xc640 (3 SHORT)
500  std::vector<uint16_t> slices;
501  IfdEntry::Ref e = _cfaIfd->getEntry(IFD::CR2_TAG_SLICE);
502  if (e) {
503  auto result2 = e->getArray<uint16_t>();
504  if (result2) {
505  slices = result2.value();
506  LOGDBG1("Found slice entry count %ld\n", slices.size());
507  }
508  }
509 
510  const IfdDir::Ref &_exifIfd = exifIfd();
511  if (!_exifIfd) {
512  LOGERR("unable to find ExifIFD\n");
513  return OR_ERROR_NOT_FOUND;
514  }
515 
516  auto result2 = _exifIfd->getValue<uint16_t>(IFD::EXIF_TAG_PIXEL_X_DIMENSION);
517  if (result2.empty()) {
518  LOGDBG1("X not found\n");
519  return OR_ERROR_NOT_FOUND;
520  }
521  uint16_t x = result2.value();
522 
523  result2 = _exifIfd->getValue<uint16_t>(IFD::EXIF_TAG_PIXEL_Y_DIMENSION);
524  if (result2.empty()) {
525  LOGDBG1("Y not found\n");
526  return OR_ERROR_NOT_FOUND;
527  }
528  uint16_t y = result2.value();
529 
530  void *p = data.allocData(byte_length);
531  size_t real_size = m_container->fetchData(p, offset, byte_length);
532  if (real_size < byte_length) {
533  LOGWARN("Size mismatch for data: ignoring.\n");
534  }
535  // they are not all RGGB.
536  // but I don't seem to see where this is encoded.
537  //
538  data.setCfaPatternType(OR_CFA_PATTERN_RGGB);
539  data.setDataType(OR_DATA_TYPE_COMPRESSED_RAW);
540  data.setDimensions(x, y);
541 
542  LOGDBG1("In size is %dx%d\n", data.width(), data.height());
543  // decompress if we need
544  if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
545  IO::Stream::Ptr s(new IO::MemStream(data.data(), data.size()));
546  s->open(); // TODO check success
547  std::unique_ptr<JfifContainer> jfif(new JfifContainer(s, 0));
548  LJpegDecompressor decomp(s.get(), jfif.get());
549  // in fact on Canon CR2 files slices either do not exists
550  // or is 3.
551  if (slices.size() > 1) {
552  decomp.setSlices(slices);
553  }
554  RawDataPtr dData = decomp.decompress();
555  if (dData) {
556  LOGDBG1("Out size is %dx%d\n", dData->width(), dData->height());
557  // must re-set the cfaPattern
558  dData->setCfaPatternType(data.cfaPattern()->patternType());
559  data.swap(*dData);
560  }
561  }
562 
563  // get the sensor info
564  const IfdDir::Ref &_makerNoteIfd = makerNoteIfd();
565  e = _makerNoteIfd->getEntry(IFD::MNOTE_CANON_SENSORINFO);
566  if (e) {
567  auto result3 = e->getArray<uint16_t>();
568  if (result3) {
569  std::vector<uint16_t> sensorInfo = result3.value();
570  if (sensorInfo.size() > 8) {
571  uint32_t w = sensorInfo[7] - sensorInfo[5];
572  uint32_t h = sensorInfo[8] - sensorInfo[6];
573  data.setRoi(sensorInfo[5], sensorInfo[6], w, h);
574  }
575  else {
576  LOGWARN("sensorInfo is too small: %lu - skipping.\n",
577  sensorInfo.size());
578  }
579  }
580  }
581 
582  return OR_ERROR_NONE;
583 }
584 }
585 }
586 
OpenRaw::Internals::IfdFile::cfaIfd
const IfdDir::Ref & cfaIfd()
Definition: ifdfile.cpp:332
OpenRaw
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard....
Definition: arwfile.cpp:30
OpenRaw::Internals::IfdFile::m_container
IfdFileContainer * m_container
Definition: ifdfile.hpp:90
OpenRaw::Internals::IfdFileContainer::setDirectory
IfdDir::Ref setDirectory(int dir)
Definition: ifdfilecontainer.cpp:88
OpenRaw::Internals::RawContainer::fetchData
size_t fetchData(void *buf, off_t offset, size_t buf_size)
Definition: rawcontainer.cpp:203
OpenRaw::Internals::IfdEntry::Ref
std::shared_ptr< IfdEntry > Ref
Definition: ifdentry.hpp:165