libopenraw  0.3.7
neffile.cpp
1 /* -*- tab-width:4; c-basic-offset:4 -*- */
2 /*
3  * libopenraw - neffile.cpp
4  *
5  * Copyright (C) 2006-2022 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 <stdio.h>
25 #include <sys/types.h>
26 
27 #include <cstdint>
28 #include <memory>
29 #include <vector>
30 
31 #include <libopenraw/cameraids.h>
32 #include <libopenraw/consts.h>
33 #include <libopenraw/debug.h>
34 
35 #include "io/streamclone.hpp"
36 
37 #include "mosaicinfo.hpp"
38 #include "rawdata.hpp"
39 #include "rawfile.hpp"
40 
41 #include "trace.hpp"
42 #include "ifd.hpp"
43 #include "ifdfilecontainer.hpp"
44 #include "ifdentry.hpp"
45 #include "makernotedir.hpp"
46 #include "nefdiffiterator.hpp"
47 #include "nefcfaiterator.hpp"
48 #include "neffile.hpp"
49 #include "rawcontainer.hpp"
50 #include "jfifcontainer.hpp"
51 #include "rawfile_private.hpp"
52 
53 using namespace Debug;
54 
55 namespace OpenRaw {
56 
57 namespace Internals {
58 
59 #define OR_MAKE_NIKON_TYPEID(camid) \
60  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_NIKON,camid)
61 
62 /* taken from dcraw, by default */
63 static const BuiltinColourMatrix s_matrices[] = {
64  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1),
65  0,
66  0, /* multiplied by 2.218750, 1.0, 1.148438 */
67  { 16772,-4726,-2141,-7611,15713,1972,-2846,3494,9521 } },
68  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100),
69  0,
70  0,
71  { 5902,-933,-782,-8983,16719,2354,-1402,1455,6464 } },
72  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1H),
73  0,
74  0,
75  { 7659, -2238, -935, -8942, 16969, 2004, -2701, 3051, 8690 } },
76  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1X),
77  0,
78  0,
79  { 7702,-2245,-975,-9114,17242,1875,-2679,3055,8521 } },
80  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D200),
81  0,
82  0xfbc,
83  { 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } },
84  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2H),
85  0,
86  0,
87  { 5710,-901,-615,-8594,16617,2024,-2975,4120,6830 } },
88  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2HS),
89  0,
90  0,
91  { 5710, -901, -615, -8594, 16617, 2024, -2975, 4120, 6830 } },
92  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2X),
93  0,
94  0,
95  { 10231,-2769,-1255,-8301,15900,2552,-797,680,7148 } },
96  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2XS),
97  0,
98  0,
99  { 10231, -2769, -1255, -8301, 15900, 2552, -797, 680, 7148 } },
100 
101  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3),
102  0,
103  0,
104  { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
105  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3S),
106  0,
107  0,
108  { 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 } },
109  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3X),
110  0,
111  0,
112  { 7171,-1986,-648,-8085,15555,2718,-2170,2512,7457 } },
113  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300),
114  0,
115  0,
116  { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
117  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300S),
118  0,
119  0,
120  { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
121  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3000),
122  0,
123  0,
124  { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
125  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3100),
126  0,
127  0,
128  { 7911,-2167,-813,-5327,13150,2408,-1288,2483,7968 } },
129  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3200),
130  0,
131  0xfb9,
132  { 7013, -1408, -635, -5268, 12902, 2640, -1470, 2801, 7379 } },
133  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3300),
134  0,
135  0,
136  { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
137  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3400),
138  0,
139  0,
140  { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
141  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3500),
142  0,
143  0,
144  { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
145 
146  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4),
147  0,
148  0,
149  { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
150  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4S),
151  0,
152  0,
153  { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
154  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40),
155  0,
156  0,
157  { 6992,-1668,-806,-8138,15748,2543,-874,850,7897 } },
158  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40X),
159  0,
160  0,
161  { 8819,-2543,-911,-9025,16928,2151,-1329,1213,8449 } },
162 
163  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5),
164  0,
165  0,
166  { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } },
167  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D50),
168  0,
169  0,
170  { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
171  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D500),
172  0,
173  0,
174  { 8813, -3210, -1036, -4703, 12868, 2021, -1054, 1940, 6129 } },
175  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5000),
176  0,
177  0xf00,
178  { 7309,-1403,-519,-8474,16008,2622,-2433,2826,8064 } },
179  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5100),
180  0,
181  0x3de6,
182  { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
183  // From DNG Converter 7.4
184  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5200),
185  0,
186  0,
187  { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
188  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5300),
189  0,
190  0,
191  { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
192  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5500),
193  0,
194  0,
195  { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
196  // From DNG Converter 10.3
197  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5600),
198  0,
199  0,
200  { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
201  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D6),
202  0,
203  0,
204  { 9028, -3423, -1035, -6321, 14265, 2217, -1013, 1683, 6928 } },
205  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D60),
206  0,
207  0,
208  { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
209  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D600),
210  0,
211  0,
212  { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
213  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D610),
214  0,
215  0,
216  { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
217 
218  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70),
219  0,
220  0,
221  { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
222  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70S),
223  0,
224  0,
225  { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
226  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D700),
227  0,
228  0,
229  { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
230  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7000),
231  0,
232  0,
233  { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
234  // From DNG Converter 7.4
235  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7100),
236  0,
237  0,
238  { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
239  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7200),
240  0,
241  0,
242  { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } },
243  // From DNG Converter 8.7-rc
244  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D750),
245  0,
246  0,
247  { 9020, -2890, -715, -4535, 12436, 2348, -934, 1919, 7086 } },
248  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7500),
249  0,
250  0,
251  { 8813, -3210, -1036, -4703, 12868, 2021, -1054, 1940, 6129 } },
252  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D780),
253  0,
254  0,
255  { 9943, -3269, -839, -5323, 13269, 2259, -1198, 2083, 7557 } },
256 
257  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D80),
258  0,
259  0,
260  { 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 } },
261  // From DNG Converter 7.1-rc
262  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800),
263  0,
264  0,
265  { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
266  // From DNG Converter 7.1-rc
267  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800E),
268  0,
269  0,
270  { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
271  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D810),
272  0,
273  0,
274  { 9369, -3195, -791, -4488, 12430, 2301, -893, 1796, 6872 } },
275  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D850),
276  0,
277  0,
278  { 10405, -3755, -1270, -5461, 13787, 1793, -1040, 2015, 6785 } },
279 
280  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D90),
281  0,
282  0xf00,
283  { 7309,-1403,-519,-8474,16008,2622,-2434,2826,8064 } },
284 
285  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z30),
286  0,
287  0,
288  { 10339, -3822, -890, -4183, 12023, 2436, -671, 1638, 7049 } },
289  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6),
290  0,
291  0,
292  { 8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464 } },
293  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6_2),
294  0,
295  0,
296  { 9943, -3269, -839, -5323, 13269, 2259, -1198, 2083, 7557 } },
297  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7),
298  0,
299  0,
300  { 10405, -3755, -1270, -5461, 13787, 1793, -1040, 2015, 6785 } },
301  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7_2),
302  0,
303  0,
304  { 13705, -6004, -1400, -5464, 13568, 2062, -940, 1706, 7618 } },
305  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z9),
306  0,
307  0,
308  { 13389, -6049, -1441, -4544, 12757, 1969, 229, 498, 7390 } },
309  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z50),
310  0,
311  0,
312  { 11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380 } },
313  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z5),
314  0,
315  0,
316  { 8695, -2558, -648, -5015, 12711, 2575, -1279, 2215, 7514 } },
317  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_ZFC),
318  0,
319  0,
320  { 11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380 } },
321 
322  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_DF),
323  0,
324  0,
325  { 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 } },
326 
327  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5400),
328  0,
329  0,
330  { 9349,-2987,-1001,-7919,15766,2266,-2098,2680,6839 } },
331 // { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5700), 0, 0,
332 // { -5368,11478,2368,5537,-113,3148,-4969,10021,5782,778,9028,211 } },
333  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8400),
334  0,
335  0,
336  { 7842,-2320,-992,-8154,15718,2599,-1098,1342,7560 } },
337  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8800),
338  0,
339  0,
340  { 7971, -2314, -913, -8451, 15762, 2894, -1442, 1520, 7610 } },
341  // From DNG Converter 10.3
342  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_B700),
343  200,
344  0,
345  { 14387, -6014, -1299, -1357, 9975, 1616, 467, 1047, 4744 } },
346  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P1000),
347  0,
348  0,
349  { 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 } },
350  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P330),
351  200,
352  0,
353  { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
354  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P340),
355  200,
356  0,
357  { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
358  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P950),
359  0,
360  0,
361  { 13307, -5641, -1290, -2048, 10581, 1689, -64, 1222, 5176 } },
362  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P6000),
363  0,
364  0,
365  { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } },
366  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7000),
367  0,
368  0,
369  { 11432, -3679, -1111, -3169, 11239, 2202, -791, 1380, 4455 } },
370  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7100),
371  0,
372  0,
373  { 11053, -4269, -1024, -1976, 10182, 2088, -526, 1263, 4469 } },
374  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7700),
375  0,
376  0,
377  { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
378  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7800),
379  200,
380  0,
381  { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
382 
383  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_AW1),
384  0,
385  0,
386  { 6588, -1305, -693, -3277, 10987, 2634, -355, 2016, 5106 } },
387  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J1),
388  0,
389  0,
390  { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
391  // From DNG Converter 7.4
392  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J2),
393  0,
394  0,
395  { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
396  // From DNG Converter 7.4
397  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J3),
398  0,
399  0,
400  { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
401  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J4),
402  0,
403  0,
404  { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
405  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J5),
406  0,
407  0,
408  { 7520, -2518, -645, -3844, 12102, 1945, -913, 2249, 6835 } },
409  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V1),
410  0,
411  0,
412  { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
413  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V2),
414  0,
415  0,
416  { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
417  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V3),
418  0,
419  0,
420  { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
421  // From DNG Converter 7.4
422  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S1),
423  0,
424  0,
425  { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
426  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S2),
427  0,
428  0,
429  { 6612, -1342, -618, -3338, 11055, 2623, -174, 1792, 5075 } },
430 
431  // From DNG Converter 7.4
432  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A),
433  0,
434  0,
435  { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
436 
437  { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A1000),
438  0,
439  0,
440  { 10601, -3487, -1127, -2931, 11443, 1676, -587, 1740, 5278 } },
441 
442  { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
443 };
444 
445 const IfdFile::camera_ids_t NefFile::s_def[] = {
446  { "NIKON D1 ", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1) },
447  { "NIKON D100 ", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100) },
448  { "NIKON D1H", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1H) },
449  { "NIKON D1X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1X) },
450  { "NIKON D200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D200) },
451  { "NIKON D2H", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2H) },
452  { "NIKON D2Hs", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2HS) },
453  { "NIKON D2X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2X) },
454  { "NIKON D2Xs", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2XS ) },
455  { "NIKON D3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3) },
456  { "NIKON D3S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3S) },
457  { "NIKON D3X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3X) },
458  { "NIKON D300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300) },
459  { "NIKON D300S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300S) },
460  { "NIKON D3000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3000) },
461  { "NIKON D3100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3100) },
462  { "NIKON D3200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3200) },
463  { "NIKON D3300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3300) },
464  { "NIKON D3400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3400) },
465  { "NIKON D3500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3500) },
466  { "NIKON D4", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4) },
467  { "NIKON D4S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4S) },
468  { "NIKON D40", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40) },
469  { "NIKON D40X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40X) },
470  { "NIKON D5", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5) },
471  { "NIKON D50", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D50) },
472  { "NIKON D500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D500) },
473  { "NIKON D5000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5000) },
474  { "NIKON D5100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5100) },
475  { "NIKON D5200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5200) },
476  { "NIKON D5300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5300) },
477  { "NIKON D5500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5500) },
478  { "NIKON D5600", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5600) },
479  { "NIKON D6", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D6) },
480  { "NIKON D60", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D60) },
481  { "NIKON D600", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D600) },
482  { "NIKON D610", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D610) },
483  { "NIKON D70", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70) },
484  { "NIKON D70s", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70S) },
485  { "NIKON D700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D700) },
486  { "NIKON D7000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7000) },
487  { "NIKON D7100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7100) },
488  { "NIKON D7200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7200) },
489  { "NIKON D750", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D750) },
490  { "NIKON D7500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7500) },
491  { "NIKON D780", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D780) },
492  { "NIKON D80", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D80) },
493  { "NIKON D800", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800) },
494  { "NIKON D800E", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800E) },
495  { "NIKON D810", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D810) },
496  { "NIKON D850", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D850) },
497  { "NIKON D90", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D90) },
498  { "NIKON Df", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_DF) },
499  { "NIKON Z 30", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z30) },
500  { "NIKON Z 6", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6) },
501  { "NIKON Z 6_2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6_2) },
502  { "NIKON Z 7", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7) },
503  { "NIKON Z 7_2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7_2) },
504  { "NIKON Z 50", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z50) },
505  { "NIKON Z 5", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z5) },
506  { "NIKON Z 9", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z9) },
507  { "NIKON Z fc", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_ZFC) },
508  { "E5400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5400) },
509  { "E5700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5700) },
510  { "E8400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8400) },
511  { "E8800", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8800) },
512  { "COOLPIX B700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_B700) },
513  { "COOLPIX P330", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P330) },
514  { "COOLPIX P340", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P340) },
515  { "COOLPIX P950", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P950) },
516  { "COOLPIX P1000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P1000) },
517  { "COOLPIX P6000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P6000) },
518  { "COOLPIX P7000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7000) },
519  { "COOLPIX P7100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7100) },
520  { "COOLPIX P7700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7700) },
521  { "COOLPIX P7800", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7800) },
522  { "COOLPIX A", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A) },
523  { "COOLPIX A1000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A1000) },
524  { "NIKON 1 J1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J1) },
525  { "NIKON 1 J2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J2) },
526  { "NIKON 1 J3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J3) },
527  { "NIKON 1 J4", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J4) },
528  { "NIKON 1 J5", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J5) },
529  { "NIKON 1 V1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V1) },
530  { "NIKON 1 V2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V2) },
531  { "NIKON 1 V3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V3) },
532  { "NIKON 1 S1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S1) },
533  { "NIKON 1 S2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S2) },
534  { "NIKON 1 AW1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_AW1) },
535  { 0, 0 }
536 };
537 
538 RawFile *NefFile::factory(const IO::Stream::Ptr & _filename)
539 {
540  return new NefFile(_filename);
541 }
542 
543 NefFile::NefFile(const IO::Stream::Ptr & _filename)
544  : TiffEpFile(_filename, OR_RAWFILE_TYPE_NEF)
545 {
546  _setIdMap(s_def);
547  _setMatrices(s_matrices);
548 }
549 
550 
551 NefFile::~NefFile()
552 {
553 }
554 
555 bool NefFile::isCompressed(RawContainer & container, uint32_t offset)
556 {
557  int i;
558  uint8_t buf[256];
559  size_t real_size = container.fetchData(buf, offset,
560  256);
561  if(real_size != 256) {
562  return true;
563  }
564  for(i = 15; i < 256; i+= 16) {
565  if(buf[i]) {
566  LOGDBG1("isCompressed: true\n");
567  return true;
568  }
569  }
570  LOGDBG1("isCompressed: false\n");
571  return false;
572 }
573 
574 bool NefFile::isNrw()
575 {
576  IfdDir::Ref _makerNoteIfd = makerNoteIfd();
577  if(!_makerNoteIfd) {
578  LOGERR("makernote not found\n");
579  return false;
580  }
581  auto value = _makerNoteIfd->getValue<std::string>(IFD::MNOTE_NIKON_QUALITY);
582  if (value && value.value() == "NRW") {
583  LOGDBG1("NRW found");
584  return true;
585  }
586  return false;
587 }
588 
590 NefFile::_unpackData(uint16_t bpc, uint32_t compression, RawData & data,
591  uint32_t x, uint32_t y, uint32_t offset, uint32_t byte_length)
592 {
593  if (typeId() == OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100)) {
594  x += 6;
595  }
596  return TiffEpFile::_unpackData(bpc, compression, data, x, y, offset, byte_length);
597 }
598 
599 ::or_error NefFile::_enumThumbnailSizes(std::vector<uint32_t> &list)
600 {
601  or_error err = this->TiffEpFile::_enumThumbnailSizes(list);
602  auto makernote = makerNoteIfd();
603  if (makernote) {
604  auto ifd = makernote->getIfdInEntry(MNOTE_NIKON_PREVIEW_IFD);
605  if (ifd) {
606  auto start = ifd->getValue<uint32_t>(MNOTE_NIKON_PREVIEWIFD_START).value_or(0);
607  auto len = ifd->getValue<uint32_t>(MNOTE_NIKON_PREVIEWIFD_LENGTH).value_or(0);
608 
609  // if either value is zero we consider it is wrong.
610  if (start != 0 && len != 0) {
611  start += makernote->getMnoteOffset();
612  err = _addThumbnailFromStream(start, len, list);
613  } else {
614  err = OR_ERROR_NOT_FOUND;
615  }
616  }
617  }
618 
619  return err;
620 }
621 
622 uint32_t NefFile::_translateCompressionType(IFD::TiffCompress tiffCompression)
623 {
624  if (tiffCompression == IFD::COMPRESS_NIKON_QUANTIZED) {
625  // must check whether it is really compressed
626  // only for D100
627  if (typeId() == OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100)) {
628  return IFD::COMPRESS_NIKON_PACK;
629  }
630  }
631  return TiffEpFile::_translateCompressionType(tiffCompression);
632 }
633 
634 ::or_error NefFile::_decompressNikonQuantized(RawData & data)
635 {
636  NEFCompressionInfo c;
637  if (!_getCompressionCurve(data, c)) {
638  LOGERR("compression curve not found\n");
639  return OR_ERROR_NOT_FOUND;
640  }
641  const uint32_t rows = data.height();
642  const uint32_t raw_columns = data.width();
643 
644  //FIXME: not always true
645  const uint32_t columns = raw_columns - 1;
646 
647  NefDiffIterator
648  diffs(c.huffman, static_cast<uint8_t*>(data.data()), data.size());
649  NefCfaIterator iter(diffs, raw_columns, c.vpred);
650 
651  RawData newData;
652  uint16_t *p = (uint16_t *) newData.allocData(rows * columns * 2);
653  newData.setDimensions(columns, rows);
654  newData.setDataType(OR_DATA_TYPE_RAW);
655  uint16_t bpc = data.bpc();
656  newData.setBpc(bpc);
657  newData.setWhiteLevel((1 << bpc) - 1);
658  newData.setCfaPatternType(data.mosaicInfo()->patternType());
659  newData.setPhotometricInterpretation(data.getPhotometricInterpretation());
660 
661  for (unsigned int i = 0; i < rows; i++) {
662  for (unsigned int j = 0; j < raw_columns; j++) {
663  uint16_t t = iter.get();
664  if (j < columns) {
665  unsigned shift = 16 - data.bpc();
666  p[i * columns + j] = c.curve[t & 0x3fff] << shift;
667  }
668  }
669  }
670 
671  data.swap(newData);
672  return OR_ERROR_NONE;
673 }
674 
675 ::or_error NefFile::_decompressIfNeeded(RawData & data,
676  uint32_t options)
677 {
678  uint32_t compression = data.compression();
679  if (isNrw()) {
680  LOGDBG1("NRW file found, currently not supported.");
682  } else if((options & OR_OPTIONS_DONT_DECOMPRESS) ||
683  compression == IFD::COMPRESS_NONE) {
684  return OR_ERROR_NONE;
685  } else if(compression == IFD::COMPRESS_NIKON_QUANTIZED) {
686  return _decompressNikonQuantized(data);
687  } else {
689  }
690 }
691 
692 bool
693 NefFile::_getCompressionCurve(RawData & data, NefFile::NEFCompressionInfo& c)
694 {
695  MakerNoteDir::Ref _makerNoteIfd = std::dynamic_pointer_cast<MakerNoteDir>(makerNoteIfd());
696  if(!_makerNoteIfd) {
697  LOGERR("makernote not found\n");
698  return false;
699  }
700  IfdEntry::Ref curveEntry = _makerNoteIfd->getEntry(IFD::MNOTE_NIKON_NEFDECODETABLE2);
701  if(!curveEntry) {
702  LOGERR("decode table2 tag not found\n");
703  return false;
704  }
705 
706  auto endian = m_container->endian();
707 
708  size_t pos = _makerNoteIfd->getMnoteOffset() + curveEntry->offset();
709 
710  auto file = m_container->file();
711  file->seek(pos, SEEK_SET);
712 
713  uint16_t bpc = data.bpc();
714  uint8_t header0, header1;
715  auto result = m_container->readUInt8(file);
716  if(result.empty()) {
717  LOGERR("Header not found\n");
718  return false;
719  }
720  header0 = result.value();
721  result = m_container->readUInt8(file);
722  if(result.empty()) {
723  LOGERR("Header not found\n");
724  return false;
725  }
726  header1 = result.value();
727 
728  if (header0 == 0x49) {
729  // some interesting stuff at 2110
730  // XXX we need to implement this.
731  LOGWARN("NEF: header0 is 0x49 - case not yet handled\n");
732  m_container->skip(2110);
733  }
734 
735  for (int i = 0; i < 2; ++i) {
736  for (int j = 0; j < 2; ++j) {
737  auto result16 = m_container->readInt16(file, endian);
738  if(result16.empty()) {
739  LOGERR("Failed to read vpred (%d,%d)\n", i, j);
740  return false;
741  }
742  c.vpred[i][j] = result16.value();
743  }
744  }
745 
746  LOGDBG2("header0 = %d header1 = %d bpc = %u\n", header0, header1, bpc);
747 
748  bool header_ok = false;
749  // header0 == 0x44 || 0x49 -> lossy
750  // header0 == 0x46 -> lossless
751  if (header0 == 0x44 || header0 == 0x49) {
752  if (bpc == 12) {
753  c.huffman = NefDiffIterator::Lossy12Bit;
754  LOGDBG1("12 bits lossy %u\n", bpc);
755  header_ok = true;
756  } else if (bpc == 14) {
757  c.huffman = NefDiffIterator::Lossy14Bit;
758  LOGDBG1("14 bits lossy %u\n", bpc);
759  header_ok = true;
760  }
761  } else if (header0 == 0x46) {
762  if (bpc == 14) {
763  c.huffman = NefDiffIterator::LossLess14Bit;
764  LOGDBG1("14 bits lossless\n");
765  header_ok = true;
766  } else if (bpc == 12) {
767 // c.huffman = NefDiffIterator::LossLess12Bit;
768  LOGDBG1("12 bits lossless\n");
769  LOGERR("12 bits lossless isn't yet supported\n");
770  header_ok = true;
771  return false;
772  }
773  }
774  if (!header_ok) {
775  LOGERR("Wrong header, found %d-%d\n", header0, header1);
776  return false;
777  }
778 
779  // number of elements in the curve
780  size_t nelems;
781  nelems = m_container->readInt16(file, endian).value_or(0);
782  LOGDBG1("Num elems %lu\n", (LSIZE)nelems);
783 
784  uint32_t ceiling = 1 << bpc & 0x7fff;
785  uint32_t step = 0;
786  if (nelems > 1) {
787  step = ceiling / (nelems - 1);
788  }
789  LOGDBG1("ceiling %u, step = %u\n", ceiling, step);
790 
791  if (header0 == 0x44 && header1 == 0x20 && step > 0) {
792  for (size_t i = 0; i < nelems; ++i) {
793  auto result16 = m_container->readInt16(file, endian);
794  if (result16.empty()) {
795  LOGERR("NEF: short read\n");
796  return false;
797  }
798  c.curve[i * step] = result16.value();
799  }
800  for (size_t i = 0; i < ceiling; ++i) {
801  c.curve[i] = (c.curve[i - i % step] * (step - i % step) +
802  c.curve[i - i % step + step] * (i % step)) / step;
803  }
804  // split flag is at offset 562.
805  // XXX
806  } else if (header0 != 0x46 && nelems <= 0x4001) {
807  size_t num_read = m_container->readUInt16Array(file, c.curve, nelems);
808  if (num_read < nelems) {
809  LOGERR("NEF: short read of %lu elements instead of %lu\n", (LSIZE)num_read, (LSIZE)nelems);
810  return false;
811  }
812  ceiling = nelems;
813  }
814 
815  auto black = c.curve[0];
816  auto white = c.curve[ceiling - 1];
817  for (size_t i = ceiling; i < 0x8000; i++) {
818  c.curve[i] = white;
819  }
820 
821  data.setBlackLevel(black);
822  data.setWhiteLevel(white);
823  LOGDBG1("black %u white %u\n", black, white);
824  return true;
825 }
826 
827 }
828 }
829 
830 /*
831  Local Variables:
832  mode:c++
833  c-file-style:"stroustrup"
834  c-file-offsets:((innamespace . 0))
835  indent-tabs-mode:nil
836  fill-column:80
837  End:
838 */
void setDataType(DataType _type)
Set the data type.
Definition: bitmapdata.cpp:91
uint32_t width() const
Width of the image data.
Definition: bitmapdata.cpp:137
uint32_t height() const
Height of the image data.
Definition: bitmapdata.cpp:142
void setBpc(uint32_t _bpc)
Set bit per channel.
Definition: bitmapdata.cpp:152
size_t size() const
Get the size of the data.
Definition: bitmapdata.cpp:120
uint32_t bpc() const
Bit per channel.
Definition: bitmapdata.cpp:147
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
Definition: ifddir.hpp:56
Generic interface for the RAW file container.
size_t fetchData(void *buf, off_t offset, size_t buf_size) const
Fetch the data chunk from the file.
::or_cfa_pattern patternType() const
Definition: mosaicinfo.cpp:199
Represent camera raw data.
Definition: rawdata.hpp:38
void swap(RawData &with)
Definition: rawdata.cpp:282
const MosaicInfo * mosaicInfo() const
Definition: rawdata.cpp:335
virtual void setDimensions(uint32_t x, uint32_t y) override
Set the pixel dimensions of the bitmap.
Definition: rawdata.cpp:297
or_error
Error codes returned by libopenraw.
Definition: consts.h:42
@ OR_DATA_TYPE_RAW
Definition: consts.h:87
@ OR_OPTIONS_DONT_DECOMPRESS
Definition: consts.h:114
@ OR_RAWFILE_TYPE_NEF
Definition: consts.h:63
@ OR_ERROR_NONE
Definition: consts.h:43
@ OR_ERROR_INVALID_FORMAT
Definition: consts.h:50
@ OR_ERROR_NOT_FOUND
Definition: consts.h:48
TiffCompress
TIFF compression.
Definition: ifd.hpp:55
Global namespace for libopenraw.
Definition: arwfile.cpp:29