25 #include <sys/types.h> 31 #include <libopenraw/cameraids.h> 32 #include <libopenraw/consts.h> 33 #include <libopenraw/debug.h> 35 #include "cfapattern.hpp" 36 #include "rawdata.hpp" 37 #include "rawfile.hpp" 42 #include "ifdfilecontainer.hpp" 43 #include "ifdentry.hpp" 44 #include "makernotedir.hpp" 45 #include "nefdiffiterator.hpp" 46 #include "nefcfaiterator.hpp" 47 #include "neffile.hpp" 48 #include "rawcontainer.hpp" 49 #include "rawfile_private.hpp" 51 using namespace Debug;
57 #define OR_MAKE_NIKON_TYPEID(camid) \ 58 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_NIKON,camid) 61 static const BuiltinColourMatrix s_matrices[] = {
62 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1),
65 { 16772,-4726,-2141,-7611,15713,1972,-2846,3494,9521 } },
66 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100),
69 { 5902,-933,-782,-8983,16719,2354,-1402,1455,6464 } },
70 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1X),
73 { 7702,-2245,-975,-9114,17242,1875,-2679,3055,8521 } },
74 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D200),
77 { 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } },
78 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2H),
81 { 5710,-901,-615,-8594,16617,2024,-2975,4120,6830 } },
82 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2X),
85 { 10231,-2769,-1255,-8301,15900,2552,-797,680,7148 } },
87 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3),
90 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
91 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3S),
94 { 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 } },
95 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3X),
98 { 7171,-1986,-648,-8085,15555,2718,-2170,2512,7457 } },
99 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300),
102 { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
103 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300S),
106 { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } },
107 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3000),
110 { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
111 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3100),
114 { 7911,-2167,-813,-5327,13150,2408,-1288,2483,7968 } },
115 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3200),
118 { 7013, -1408, -635, -5268, 12902, 2640, -1470, 2801, 7379 } },
119 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3300),
122 { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
124 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4),
127 { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
128 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4S),
131 { 8598, -2848, -857, -5618, 13606, 2195, -1002, 1773, 7137 } },
132 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40),
135 { 6992,-1668,-806,-8138,15748,2543,-874,850,7897 } },
136 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40X),
139 { 8819,-2543,-911,-9025,16928,2151,-1329,1213,8449 } },
141 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5),
144 { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } },
145 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D50),
148 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
149 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D500),
152 { 8813, -3210, -1036, -4703, 12868, 2021, -1054, 1940, 6129 } },
153 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5000),
156 { 7309,-1403,-519,-8474,16008,2622,-2433,2826,8064 } },
157 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5100),
160 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
162 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5200),
165 { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
166 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5300),
169 { 6988, -1384, -714, -5631, 13410, 2447, -1485, 2204, 7318 } },
170 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5500),
173 { 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 } },
175 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D60),
178 { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } },
179 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D600),
182 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
183 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D610),
186 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
188 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70),
191 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
192 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70S),
195 { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } },
196 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D700),
199 { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } },
200 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7000),
203 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
205 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7100),
208 { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } },
209 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7200),
212 { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } },
214 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D750),
217 { 9020, -2890, -715, -4535, 12436, 2348, -934, 1919, 7086 } },
219 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D80),
222 { 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 } },
224 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800),
227 { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
229 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800E),
232 { 7866, -2108, -555, -4869, 12483, 2681, -1176, 2069, 7501 } },
233 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D810),
236 { 9369, -3195, -791, -4488, 12430, 2301, -893, 1796, 6872 } },
238 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D90),
241 { 7309,-1403,-519,-8474,16008,2622,-2434,2826,8064 } },
243 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_DF),
246 { 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 } },
248 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5400),
251 { 9349,-2987,-1001,-7919,15766,2266,-2098,2680,6839 } },
254 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8400),
257 { 7842,-2320,-992,-8154,15718,2599,-1098,1342,7560 } },
259 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P6000),
262 { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } },
263 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7000),
266 { 11432,-3679,-1111,-3169,11239,2202,-791,1380,4455 } },
267 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7100),
270 { 11053,-4269,-1024,-1976,10182,2088,-526,1263,4469 } },
271 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7700),
274 { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } },
276 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_AW1),
279 { 6588, -1305, -693, -3277, 10987, 2634, -355, 2016, 5106 } },
280 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J1),
283 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
285 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J2),
288 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
290 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J3),
293 { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
294 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J4),
297 { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
298 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J5),
301 { 7520, -2518, -645, -3844, 12102, 1945, -913, 2249, 6835 } },
302 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V1),
305 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
306 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V2),
309 { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } },
310 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V3),
313 { 5958, -1559, -571, -4021, 11453, 2939, -634, 1548, 5087 } },
315 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S1),
318 { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } },
319 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S2),
322 { 6612, -1342, -618, -3338, 11055, 2623, -174, 1792, 5075 } },
325 { OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A),
328 { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } },
330 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
333 const IfdFile::camera_ids_t NefFile::s_def[] = {
334 {
"NIKON D1 ", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1) },
335 {
"NIKON D100 ", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D100) },
336 {
"NIKON D1X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D1X) },
337 {
"NIKON D200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D200) },
338 {
"NIKON D2H", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2H ) },
339 {
"NIKON D2X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D2X ) },
340 {
"NIKON D3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3) },
341 {
"NIKON D3S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3S) },
342 {
"NIKON D3X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3X) },
343 {
"NIKON D300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300) },
344 {
"NIKON D300S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D300S) },
345 {
"NIKON D3000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3000) },
346 {
"NIKON D3100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3100) },
347 {
"NIKON D3200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3200) },
348 {
"NIKON D3300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3300) },
349 {
"NIKON D3400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D3400) },
350 {
"NIKON D4", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4) },
351 {
"NIKON D4S", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D4S) },
352 {
"NIKON D40", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40) },
353 {
"NIKON D40X", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D40X) },
354 {
"NIKON D5", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5) },
355 {
"NIKON D50", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D50) },
356 {
"NIKON D500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D500) },
357 {
"NIKON D5000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5000) },
358 {
"NIKON D5100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5100) },
359 {
"NIKON D5200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5200) },
360 {
"NIKON D5300", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5300) },
361 {
"NIKON D5500", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5500) },
362 {
"NIKON D5600", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D5600) },
363 {
"NIKON D60", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D60) },
364 {
"NIKON D600", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D600) },
365 {
"NIKON D610", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D610) },
366 {
"NIKON D70", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70) },
367 {
"NIKON D70s", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D70S) },
368 {
"NIKON D700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D700) },
369 {
"NIKON D7000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7000) },
370 {
"NIKON D7100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7100) },
371 {
"NIKON D7200", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D7200) },
372 {
"NIKON D750", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D750) },
373 {
"NIKON D80", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D80) },
374 {
"NIKON D800", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800) },
375 {
"NIKON D800E", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D800E) },
376 {
"NIKON D810", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D810) },
377 {
"NIKON D90", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_D90) },
378 {
"NIKON Df", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_DF) },
379 {
"E5400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5400) },
380 {
"E5700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E5700) },
381 {
"E8400", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_E8400) },
382 {
"COOLPIX P6000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P6000) },
383 {
"COOLPIX P7000", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7000) },
384 {
"COOLPIX P7100", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7100) },
385 {
"COOLPIX P7700", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_P7700) },
386 {
"COOLPIX A", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_COOLPIX_A) },
387 {
"NIKON 1 J1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J1) },
388 {
"NIKON 1 J2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J2) },
389 {
"NIKON 1 J3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J3) },
390 {
"NIKON 1 J4", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J4) },
391 {
"NIKON 1 J5", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_J5) },
392 {
"NIKON 1 V1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V1) },
393 {
"NIKON 1 V2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V2) },
394 {
"NIKON 1 V3", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_V3) },
395 {
"NIKON 1 S1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S1) },
396 {
"NIKON 1 S2", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_S2) },
397 {
"NIKON 1 AW1", OR_MAKE_NIKON_TYPEID(OR_TYPEID_NIKON_1_AW1) },
401 RawFile *NefFile::factory(
const IO::Stream::Ptr & _filename)
403 return new NefFile(_filename);
406 NefFile::NefFile(
const IO::Stream::Ptr & _filename)
407 : TiffEpFile(_filename, OR_RAWFILE_TYPE_NEF)
410 _setMatrices(s_matrices);
422 size_t real_size = container.
fetchData(buf, offset,
424 if(real_size != 256) {
427 for(i = 15; i < 256; i+= 16) {
429 LOGDBG1(
"isCompressed: true\n");
433 LOGDBG1(
"isCompressed: false\n");
437 ::or_error NefFile::_decompressNikonQuantized(
RawData & data)
440 if (!_getCompressionCurve(data, c)) {
441 LOGERR(
"compression curve not found\n");
442 return OR_ERROR_NOT_FOUND;
444 const uint32_t rows = data.height();
445 const uint32_t raw_columns = data.width();
448 const uint32_t columns = raw_columns - 1;
451 diffs(c.huffman, static_cast<uint8_t*>(data.data()), data.
size());
455 uint16_t *p = (uint16_t *) newData.allocData(rows * columns * 2);
458 uint16_t bpc = data.
bpc();
460 newData.setWhiteLevel((1 << bpc) - 1);
463 for (
unsigned int i = 0; i < rows; i++) {
464 for (
unsigned int j = 0; j < raw_columns; j++) {
465 uint16_t t = iter.get();
467 unsigned shift = 16 - data.
bpc();
468 p[i * columns + j] = c.curve[t & 0x3fff] << shift;
474 return OR_ERROR_NONE;
477 ::or_error NefFile::_decompressIfNeeded(
RawData & data,
480 uint32_t compression = data.compression();
481 if((options & OR_OPTIONS_DONT_DECOMPRESS) ||
482 compression == IFD::COMPRESS_NONE) {
483 return OR_ERROR_NONE;
484 }
else if(compression == IFD::COMPRESS_NIKON_QUANTIZED) {
485 return _decompressNikonQuantized(data);
487 return OR_ERROR_INVALID_FORMAT;
494 MakerNoteDir::Ref _makerNoteIfd = makerNoteIfd();
496 LOGERR(
"makernote not found\n");
499 IfdEntry::Ref curveEntry = _makerNoteIfd->getEntry(IFD::MNOTE_NIKON_NEFDECODETABLE2);
501 LOGERR(
"decode table2 tag not found\n");
505 size_t pos = _makerNoteIfd->getMnoteOffset() + curveEntry->offset();
507 auto file = m_container->file();
508 file->seek(pos, SEEK_SET);
510 uint16_t bpc = data.
bpc();
511 uint8_t header0, header1;
512 auto result = m_container->readUInt8(file);
514 LOGERR(
"Header not found\n");
517 header0 = result.unwrap();
518 result = m_container->readUInt8(file);
520 LOGERR(
"Header not found\n");
523 header1 = result.unwrap();
525 if (header0 == 0x49) {
528 LOGWARN(
"NEF: header0 is 0x49 - case not yet handled\n");
529 m_container->skip(2110);
532 for (
int i = 0; i < 2; ++i) {
533 for (
int j = 0; j < 2; ++j) {
534 auto result16 = m_container->readInt16(file);
535 if(result16.empty()) {
536 LOGERR(
"Failed to read vpred (%d,%d)\n", i, j);
539 c.vpred[i][j] = result16.unwrap();
543 LOGDBG2(
"header0 = %d header1 = %d bpc = %u\n", header0, header1, bpc);
545 bool header_ok =
false;
548 if (header0 == 0x44 || header0 == 0x49) {
550 c.huffman = NefDiffIterator::Lossy12Bit;
551 LOGDBG1(
"12 bits lossy %u\n", bpc);
553 }
else if (bpc == 14) {
554 c.huffman = NefDiffIterator::Lossy14Bit;
555 LOGDBG1(
"14 bits lossy %u\n", bpc);
558 }
else if (header0 == 0x46) {
560 c.huffman = NefDiffIterator::LossLess14Bit;
561 LOGDBG1(
"14 bits lossless\n");
563 }
else if (bpc == 12) {
565 LOGDBG1(
"12 bits lossless\n");
566 LOGERR(
"12 bits lossless isn't yet supported\n");
572 LOGERR(
"Wrong header, found %d-%d\n", header0, header1);
578 nelems = m_container->readInt16(file).unwrap_or(0);
579 LOGDBG1(
"Num elems %ld\n", nelems);
581 uint32_t ceiling = 1 << bpc & 0x7fff;
584 step = ceiling / (nelems - 1);
586 LOGDBG1(
"ceiling %u, step = %u\n", ceiling, step);
588 if (header0 == 0x44 && header1 == 0x20 && step > 0) {
589 for (
size_t i = 0; i < nelems; ++i) {
590 auto result16 = m_container->readInt16(file);
591 if (result16.empty()) {
592 LOGERR(
"NEF: short read\n");
595 c.curve[i * step] = result16.unwrap();
597 for (
size_t i = 0; i < ceiling; ++i) {
598 c.curve[i] = (c.curve[i - i % step] * (step - i % step) +
599 c.curve[i - i % step + step] * (i % step)) / step;
603 }
else if (header0 != 0x46 && nelems <= 0x4001) {
604 size_t num_read = m_container->readUInt16Array(file, c.curve, nelems);
605 if (num_read < nelems) {
606 LOGERR(
"NEF: short read of %ld elements instead of %ld\n", num_read, nelems);
612 auto black = c.curve[0];
613 auto white = c.curve[ceiling - 1];
614 for (
size_t i = ceiling; i < 0x8000; i++) {
618 data.setBlackLevel(black);
619 data.setWhiteLevel(white);
620 LOGDBG1(
"black %u white %u\n", black, white);
size_t fetchData(void *buf, off_t offset, size_t buf_size)
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
void setBpc(uint32_t _bpc)
std::shared_ptr< IfdEntry > Ref
static bool isCompressed(RawContainer &container, uint32_t offset)
::or_cfa_pattern patternType() const
const CfaPattern * cfaPattern() const
void setDataType(DataType _type)
virtual void setDimensions(uint32_t x, uint32_t y) override