25 #include <sys/types.h>
31 #include <libopenraw/cameraids.h>
32 #include <libopenraw/consts.h>
33 #include <libopenraw/debug.h>
35 #include "io/streamclone.hpp"
37 #include "mosaicinfo.hpp"
38 #include "rawdata.hpp"
39 #include "rawfile.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"
53 using namespace Debug;
59 #define OR_MAKE_NIKON_TYPEID(camid) \
60 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_NIKON,camid)
63 static const BuiltinColourMatrix s_matrices[] = {
64 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1),
67 { 16772,-4726,-2141,-7611,15713,1972,-2846,3494,9521 } },
68 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100),
71 { 5902,-933,-782,-8983,16719,2354,-1402,1455,6464 } },
72 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1H),
75 { 7659, -2238, -935, -8942, 16969, 2004, -2701, 3051, 8690 } },
76 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1X),
79 { 7702,-2245,-975,-9114,17242,1875,-2679,3055,8521 } },
80 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D200),
83 { 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } },
84 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2H),
87 { 5710,-901,-615,-8594,16617,2024,-2975,4120,6830 } },
88 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2HS),
91 { 5710, -901, -615, -8594, 16617, 2024, -2975, 4120, 6830 } },
92 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2X),
95 { 10231,-2769,-1255,-8301,15900,2552,-797,680,7148 } },
96 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2XS),
99 { 10231, -2769, -1255, -8301, 15900, 2552, -797, 680, 7148 } },
101 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3),
104 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
105 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3S),
108 { 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 } },
109 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3X),
112 { 7171,-1986,-648,-8085,15555,2718,-2170,2512,7457 } },
113 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300),
116 { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
117 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300S),
120 { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
121 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3000),
124 { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
125 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3100),
128 { 7911,-2167,-813,-5327,13150,2408,-1288,2483,7968 } },
129 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3200),
132 { 7013, -1408, -635, -5268, 12902, 2640, -1470, 2801, 7379 } },
133 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3300),
136 { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
137 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3400),
140 { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
141 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3500),
144 { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
146 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4),
149 { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
150 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4S),
153 { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
154 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40),
157 { 6992,-1668,-806,-8138,15748,2543,-874,850,7897 } },
158 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40X),
161 { 8819,-2543,-911,-9025,16928,2151,-1329,1213,8449 } },
163 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5),
166 { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } },
167 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D50),
170 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
171 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D500),
174 { 8813, -3210, -1036, -4703, 12868, 2021, -1054, 1940, 6129 } },
175 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5000),
178 { 7309,-1403,-519,-8474,16008,2622,-2433,2826,8064 } },
179 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5100),
182 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
184 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5200),
187 { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
188 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5300),
191 { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
192 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5500),
195 { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
197 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5600),
200 { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
201 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D6),
204 { 9028, -3423, -1035, -6321, 14265, 2217, -1013, 1683, 6928 } },
205 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D60),
208 { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
209 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D600),
212 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
213 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D610),
216 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
218 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70),
221 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
222 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70S),
225 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
226 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D700),
229 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
230 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7000),
233 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
235 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7100),
238 { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
239 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7200),
242 { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } },
244 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D750),
247 { 9020, -2890, -715, -4535, 12436, 2348, -934, 1919, 7086 } },
248 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7500),
251 { 8813, -3210, -1036, -4703, 12868, 2021, -1054, 1940, 6129 } },
252 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D780),
255 { 9943, -3269, -839, -5323, 13269, 2259, -1198, 2083, 7557 } },
257 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D80),
260 { 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 } },
262 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800),
265 { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
267 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800E),
270 { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
271 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D810),
274 { 9369, -3195, -791, -4488, 12430, 2301, -893, 1796, 6872 } },
275 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D850),
278 { 10405, -3755, -1270, -5461, 13787, 1793, -1040, 2015, 6785 } },
280 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D90),
283 { 7309,-1403,-519,-8474,16008,2622,-2434,2826,8064 } },
285 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z30),
288 { 10339, -3822, -890, -4183, 12023, 2436, -671, 1638, 7049 } },
289 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6),
292 { 8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464 } },
293 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z6_2),
296 { 9943, -3269, -839, -5323, 13269, 2259, -1198, 2083, 7557 } },
297 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7),
300 { 10405, -3755, -1270, -5461, 13787, 1793, -1040, 2015, 6785 } },
301 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z7_2),
304 { 13705, -6004, -1400, -5464, 13568, 2062, -940, 1706, 7618 } },
305 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z9),
308 { 13389, -6049, -1441, -4544, 12757, 1969, 229, 498, 7390 } },
309 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z50),
312 { 11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380 } },
313 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_Z5),
316 { 8695, -2558, -648, -5015, 12711, 2575, -1279, 2215, 7514 } },
317 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_ZFC),
320 { 11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380 } },
322 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_DF),
325 { 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 } },
327 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5400),
330 { 9349,-2987,-1001,-7919,15766,2266,-2098,2680,6839 } },
333 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8400),
336 { 7842,-2320,-992,-8154,15718,2599,-1098,1342,7560 } },
337 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8800),
340 { 7971, -2314, -913, -8451, 15762, 2894, -1442, 1520, 7610 } },
342 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_B700),
345 { 14387, -6014, -1299, -1357, 9975, 1616, 467, 1047, 4744 } },
346 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P1000),
349 { 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 } },
350 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P330),
353 { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
354 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P340),
357 { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
358 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P950),
361 { 13307, -5641, -1290, -2048, 10581, 1689, -64, 1222, 5176 } },
362 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P6000),
365 { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } },
366 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7000),
369 { 11432, -3679, -1111, -3169, 11239, 2202, -791, 1380, 4455 } },
370 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7100),
373 { 11053, -4269, -1024, -1976, 10182, 2088, -526, 1263, 4469 } },
374 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7700),
377 { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
378 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7800),
381 { 10321, -3920, -931, -2750, 11146, 1824, -442, 1545, 5539 } },
383 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_AW1),
386 { 6588, -1305, -693, -3277, 10987, 2634, -355, 2016, 5106 } },
387 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J1),
390 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
392 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J2),
395 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
397 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J3),
400 { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
401 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J4),
404 { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
405 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J5),
408 { 7520, -2518, -645, -3844, 12102, 1945, -913, 2249, 6835 } },
409 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V1),
412 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
413 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V2),
416 { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
417 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V3),
420 { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
422 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S1),
425 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
426 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S2),
429 { 6612, -1342, -618, -3338, 11055, 2623, -174, 1792, 5075 } },
432 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A),
435 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
437 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A1000),
440 { 10601, -3487, -1127, -2931, 11443, 1676, -587, 1740, 5278 } },
442 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
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) },
538 RawFile *NefFile::factory(
const IO::Stream::Ptr & _filename)
540 return new NefFile(_filename);
543 NefFile::NefFile(
const IO::Stream::Ptr & _filename)
547 _setMatrices(s_matrices);
559 size_t real_size = container.
fetchData(buf, offset,
561 if(real_size != 256) {
564 for(i = 15; i < 256; i+= 16) {
566 LOGDBG1(
"isCompressed: true\n");
570 LOGDBG1(
"isCompressed: false\n");
574 bool NefFile::isNrw()
578 LOGERR(
"makernote not found\n");
581 auto value = _makerNoteIfd->getValue<std::string>(IFD::MNOTE_NIKON_QUALITY);
582 if (value && value.value() ==
"NRW") {
583 LOGDBG1(
"NRW found");
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)
593 if (typeId() == OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100)) {
596 return TiffEpFile::_unpackData(bpc, compression, data, x, y, offset, byte_length);
599 ::or_error NefFile::_enumThumbnailSizes(std::vector<uint32_t> &list)
601 or_error err = this->TiffEpFile::_enumThumbnailSizes(list);
602 auto makernote = makerNoteIfd();
604 auto ifd = makernote->getIfdInEntry(MNOTE_NIKON_PREVIEW_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);
610 if (start != 0 && len != 0) {
611 start += makernote->getMnoteOffset();
612 err = _addThumbnailFromStream(start, len, list);
624 if (tiffCompression == IFD::COMPRESS_NIKON_QUANTIZED) {
627 if (typeId() == OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100)) {
628 return IFD::COMPRESS_NIKON_PACK;
631 return TiffEpFile::_translateCompressionType(tiffCompression);
636 NEFCompressionInfo c;
637 if (!_getCompressionCurve(data, c)) {
638 LOGERR(
"compression curve not found\n");
641 const uint32_t rows = data.
height();
642 const uint32_t raw_columns = data.
width();
645 const uint32_t columns = raw_columns - 1;
648 diffs(c.huffman,
static_cast<uint8_t*
>(data.data()), data.
size());
649 NefCfaIterator iter(diffs, raw_columns, c.vpred);
652 uint16_t *p = (uint16_t *) newData.allocData(rows * columns * 2);
655 uint16_t bpc = data.
bpc();
657 newData.setWhiteLevel((1 << bpc) - 1);
659 newData.setPhotometricInterpretation(data.getPhotometricInterpretation());
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();
665 unsigned shift = 16 - data.
bpc();
666 p[i * columns + j] = c.curve[t & 0x3fff] << shift;
675 ::or_error NefFile::_decompressIfNeeded(RawData & data,
678 uint32_t compression = data.compression();
680 LOGDBG1(
"NRW file found, currently not supported.");
683 compression == IFD::COMPRESS_NONE) {
685 }
else if(compression == IFD::COMPRESS_NIKON_QUANTIZED) {
686 return _decompressNikonQuantized(data);
693 NefFile::_getCompressionCurve(RawData & data, NefFile::NEFCompressionInfo& c)
695 MakerNoteDir::Ref _makerNoteIfd = std::dynamic_pointer_cast<MakerNoteDir>(makerNoteIfd());
697 LOGERR(
"makernote not found\n");
700 IfdEntry::Ref curveEntry = _makerNoteIfd->getEntry(IFD::MNOTE_NIKON_NEFDECODETABLE2);
702 LOGERR(
"decode table2 tag not found\n");
706 auto endian = m_container->endian();
708 size_t pos = _makerNoteIfd->getMnoteOffset() + curveEntry->offset();
710 auto file = m_container->file();
711 file->seek(pos, SEEK_SET);
713 uint16_t bpc = data.bpc();
714 uint8_t header0, header1;
715 auto result = m_container->readUInt8(file);
717 LOGERR(
"Header not found\n");
720 header0 = result.value();
721 result = m_container->readUInt8(file);
723 LOGERR(
"Header not found\n");
726 header1 = result.value();
728 if (header0 == 0x49) {
731 LOGWARN(
"NEF: header0 is 0x49 - case not yet handled\n");
732 m_container->skip(2110);
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);
742 c.vpred[i][j] = result16.value();
746 LOGDBG2(
"header0 = %d header1 = %d bpc = %u\n", header0, header1, bpc);
748 bool header_ok =
false;
751 if (header0 == 0x44 || header0 == 0x49) {
753 c.huffman = NefDiffIterator::Lossy12Bit;
754 LOGDBG1(
"12 bits lossy %u\n", bpc);
756 }
else if (bpc == 14) {
757 c.huffman = NefDiffIterator::Lossy14Bit;
758 LOGDBG1(
"14 bits lossy %u\n", bpc);
761 }
else if (header0 == 0x46) {
763 c.huffman = NefDiffIterator::LossLess14Bit;
764 LOGDBG1(
"14 bits lossless\n");
766 }
else if (bpc == 12) {
768 LOGDBG1(
"12 bits lossless\n");
769 LOGERR(
"12 bits lossless isn't yet supported\n");
775 LOGERR(
"Wrong header, found %d-%d\n", header0, header1);
781 nelems = m_container->readInt16(file, endian).value_or(0);
782 LOGDBG1(
"Num elems %lu\n", (LSIZE)nelems);
784 uint32_t ceiling = 1 << bpc & 0x7fff;
787 step = ceiling / (nelems - 1);
789 LOGDBG1(
"ceiling %u, step = %u\n", ceiling, step);
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");
798 c.curve[i * step] = result16.value();
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;
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);
815 auto black = c.curve[0];
816 auto white = c.curve[ceiling - 1];
817 for (
size_t i = ceiling; i < 0x8000; i++) {
821 data.setBlackLevel(black);
822 data.setWhiteLevel(white);
823 LOGDBG1(
"black %u white %u\n", black, white);
void setDataType(DataType _type)
Set the data type.
uint32_t width() const
Width of the image data.
uint32_t height() const
Height of the image data.
void setBpc(uint32_t _bpc)
Set bit per channel.
size_t size() const
Get the size of the data.
uint32_t bpc() const
Bit per channel.
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
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
Represent camera raw data.
const MosaicInfo * mosaicInfo() const
virtual void setDimensions(uint32_t x, uint32_t y) override
Set the pixel dimensions of the bitmap.
or_error
Error codes returned by libopenraw.
@ OR_OPTIONS_DONT_DECOMPRESS
@ OR_ERROR_INVALID_FORMAT
TiffCompress
TIFF compression.
Global namespace for libopenraw.