25 #include <libopenraw/debug.h>
26 #include <libopenraw/cameraids.h>
27 #include <libopenraw/consts.h>
29 #include "mosaicinfo.hpp"
30 #include "rawdata.hpp"
31 #include "rawfile.hpp"
33 #include "ifdfilecontainer.hpp"
34 #include "makernotedir.hpp"
37 #include "orffile.hpp"
40 #include "ifdentry.hpp"
41 #include "orfcontainer.hpp"
42 #include "olympusdecompressor.hpp"
43 #include "rawfile_private.hpp"
44 #include "io/streamclone.hpp"
45 #include "jfifcontainer.hpp"
48 using namespace Debug;
53 #define OR_MAKE_OLYMPUS_TYPEID(camid) \
54 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_OLYMPUS,camid)
57 static const BuiltinColourMatrix s_matrices[] = {
58 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E1),
61 { 11846,-4767,-945,-7027,15878,1089,-2699,4122,8311 } },
62 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E10),
65 { 12745,-4500,-1416,-6062,14542,1580,-1934,2256,6603 } },
66 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E3),
69 { 9487,-2875,-1115,-7533,15606,2010,-1618,2100,7389 } },
70 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E30),
73 { 8144, -1861, -1111, -7763, 15894, 1929, -1865, 2542, 7607 } },
74 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E5),
77 { 11200,-3783,-1325,-4576,12593,2206,-695,1742,7504 } },
78 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E300),
81 { 7828,-1761,-348,-5788,14071,1830,-2853,4518,6557 } },
82 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E330),
85 { 8961,-2473,-1084,-7979,15990,2067,-2319,3035,8249 } },
86 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E400),
89 { 6169,-1483,-21,-7107,14761,2536,-2904,3580,8568 } },
90 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E410),
93 { 8856,-2582,-1026,-7761,15766,2082,-2009,2575,7469 } },
94 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E420),
97 { 8745, -2425, -1095, -7594, 15613, 2073, -1780, 2309, 7416 } },
98 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E450),
101 { 8745, -2425, -1095, -7594, 15613, 2073, -1780, 2309, 7416 } },
102 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E500),
105 { 8136,-1968,-299,-5481,13742,1871,-2556,4205,6630 } },
106 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E510),
109 { 8785,-2529,-1033,-7639,15624,2112,-1783,2300,7817 } },
110 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E520),
113 { 8343, -2322, -1020, -7596, 15635, 2048, -1748, 2269, 7287 } },
114 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E600),
117 { 8453, -2198, -1092, -7609, 15681, 2008, -1725, 2337, 7824 } },
118 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E620),
121 { 8453,-2198,-1092,-7609,15681,2008,-1725,2337,7824 } },
122 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP350),
125 { 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } },
126 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP500UZ),
129 { 9493,-3415,-666,-5211,12334,3260,-1548,2262,6482 } },
130 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP510UZ),
133 { 10593,-3607,-1010,-5881,13127,3084,-1200,1805,6721 } },
134 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP550UZ),
137 { 11597,-4006,-1049,-5432,12799,2957,-1029,1750,6516 } },
138 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP565UZ),
141 { 11856, -4470, -1159, -4814, 12368, 2756, -994, 1780, 5589 } },
142 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP570UZ),
145 { 11522, -4044, -1145, -4737, 12172, 2903, -987, 1829, 6039 } },
146 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP1),
149 { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } },
150 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP2),
153 { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } },
154 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP3),
157 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
158 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP5),
161 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
162 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP7),
165 { 9476, -3182, -765, -2613, 10958, 1893, -449, 1315, 5268 } },
166 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL1),
169 { 11408,-4289,-1215,-4286,12385,2118,-387,1467,7787 } },
170 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL2),
173 { 15030,-5552,-1806,-3987,12387,1767,-592,1670,7023 } },
174 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL3),
177 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
178 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL5),
181 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
182 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL6),
185 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
186 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL7),
189 { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } },
190 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL8),
193 { 9197, -3190, -659, -2606, 10830, 2039, -458, 1250, 5458 } },
194 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL9),
197 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
198 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL10),
201 { 9197, -3190, -659, -2606, 10830, 2039, -458, 1250, 5458 } },
202 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM1),
205 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
206 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM2),
209 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
210 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ1),
213 { 10901,-4095,-1074,-1141,9208,2293,-62,1417,5158 } },
214 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ10),
217 { 9777, -3483, -925, -2886, 11297, 1800, -602, 1663, 5134 } },
218 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ2),
221 { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } },
222 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5),
225 { 8380, -2630, -639, -2887, 725, 2496, -627, 1427, 5438 } },
226 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5II),
229 { 9422, -3258, -711, -2655, 10898, 2015, -512, 1354, 5512 } },
230 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5III),
233 { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } },
234 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1),
237 { 7687, -1984, -606, -4327, 11928, 2721, -1381, 2339, 6452 } },
238 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1II),
241 { 9383, -3170, -763, -2457, 10702, 2020, -384, 1236, 5552 } },
242 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1III),
245 { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } },
246 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10),
249 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
250 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10II),
253 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
254 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10III),
257 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
258 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10IIIS),
261 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
262 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10IV),
265 { 9476, -3182, -765, -2613, 10958, 1893, -449, 1315, 5268 } },
266 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1X),
269 { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } },
270 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_OM1),
273 { 9488, -3984, -714, -2887, 10945, 2229, -137, 960, 5786 } },
274 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_OM5),
277 { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } },
278 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1),
281 { 8360, -2420, -880, -3928, 12353, 1739, -1381, 2416, 5173 } },
282 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1_1S),
285 { 8360, -2420, -880, -3928, 12353, 1739, -1381, 2416, 5173 } },
286 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_PEN_F),
289 { 9476, -3182, -765, -2613, 10958, 1893, -449, 1315, 5268 } },
290 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SH2),
293 { 10156, -3425, -1077, -2611, 11177, 1624, -385, 1592, 5080 } },
294 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG4),
297 { 11426, -4159, -1126, -2066, 10678, 1593, -120, 1327, 4998 } },
298 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG5),
301 { 10899, -3833, -1082, -2112, 10736, 1575, -267, 1452, 5269 } },
302 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG6),
305 { 10899, -3833, -1082, -2112, 10736, 1575, -267, 1452, 5269 } },
306 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_C5060WZ),
309 { 10445, -3362, -1307, -7662, 15690, 2058, -1135, 1176, 7602 } },
310 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
315 {
"E-1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E1) },
316 {
"E-10 " , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E10) },
317 {
"E-3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E3) },
318 {
"E-30 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E30) },
319 {
"E-5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E5) },
320 {
"E-300 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E300) },
321 {
"E-330 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E330) },
322 {
"E-400 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E400) },
323 {
"E-410 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E410) },
324 {
"E-420 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E420) },
325 {
"E-450 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E450) },
326 {
"E-500 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E500) },
327 {
"E-510 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E510) },
328 {
"E-520 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E520) },
329 {
"E-600 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E600) },
330 {
"E-620 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E620) },
331 {
"SP350" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP350) },
332 {
"SP500UZ" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP500UZ) },
333 {
"SP510UZ" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP510UZ) },
334 {
"SP550UZ ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP550UZ) },
335 {
"SP565UZ ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP565UZ) },
336 {
"SP570UZ ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP570UZ) },
337 {
"E-P1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP1) },
338 {
"E-P2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP2) },
339 {
"E-P3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP3) },
340 {
"E-P5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP5) },
341 {
"E-P7 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP7) },
342 {
"E-PL1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL1) },
343 {
"E-PL2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL2) },
344 {
"E-PL3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL3) },
345 {
"E-PL5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL5) },
346 {
"E-PL6 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL6) },
347 {
"E-PL7 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL7) },
348 {
"E-PL8 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL8) },
349 {
"E-PL9 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL9) },
350 {
"E-PL10 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL10) },
351 {
"E-PM1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM1) },
352 {
"E-PM2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM2) },
353 {
"XZ-1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ1) },
354 {
"XZ-10 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ10) },
355 {
"XZ-2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ2) },
356 {
"E-M5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5) },
357 {
"E-M5MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5II) },
358 {
"E-M5MarkIII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5III) },
359 {
"E-M1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1) },
360 {
"E-M1MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1II) },
361 {
"E-M1MarkIII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1III) },
362 {
"E-M1X ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1X) },
363 {
"E-M10 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10) },
364 {
"E-M10MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10II) },
365 {
"E-M10 Mark III ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10III) },
366 {
"E-M10MarkIIIS ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10IIIS) },
367 {
"E-M10MarkIV ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10IV) },
368 {
"OM-1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_OM1) },
369 {
"OM-5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_OM5) },
370 {
"STYLUS1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1) },
371 {
"STYLUS1,1s ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1_1S) },
372 {
"PEN-F ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_PEN_F) },
373 {
"SH-2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SH2) },
374 {
"TG-4 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG4) },
375 {
"TG-5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG5) },
376 {
"TG-6 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG6) },
377 {
"C5060WZ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_C5060WZ) },
390 _setMatrices(s_matrices);
403 LOGDBG1(
"got %lu thumbs\n", (LSIZE)list.size());
407 LOGDBG1(
"can't get exif\n");
411 auto makerNote = std::dynamic_pointer_cast<MakerNoteDir>(exif->getMakerNoteIfd(
type()));
413 LOGDBG1(
"can't get makernote\n");
417 auto e = makerNote->getEntry(ORF_TAG_THUMBNAIL_IMAGE);
420 auto ifd = makerNote->getIfdInEntry(ORF_TAG_CAMERA_SETTINGS);
422 LOGDBG1(
"CameraSettings %lu\n", (LSIZE)ifd->entries().size());
423 uint32_t is_valid = ifd->getValue<uint32_t>(ORF_TAG_CS_PREVIEW_IMAGE_VALID).value_or(0);
426 ifd->getValue<uint32_t>(ORF_TAG_CS_PREVIEW_IMAGE_START).value_or(0);
428 start += makerNote->getMnoteOffset();
430 uint32_t len = ifd->getValue<uint32_t>(ORF_TAG_CS_PREVIEW_IMAGE_LENGTH).value_or(0);
431 LOGDBG1(
"is_valid %u, start %u len %u\n", is_valid, start, len);
434 if (start != 0 && len != 0) {
452 uint32_t x = data.
width();
453 uint32_t y = data.
height();
454 uint32_t compression = 0;
455 if(data.
size() < x * y * 2) {
461 compression = data.compression();
463 switch(compression) {
466 err = decompress(x, y, data);
479 if (data.
size() == (y * ((x * 12 / 8) + ((x + 2) / 10)))) {
481 LOGDBG1(
"ORF: unpack with control\n");
482 RawDataPtr output(
new RawData);
484 uint32_t current_offset = 0;
486 const size_t blocksize = unpack.block_size();
487 LOGDBG1(
"Block size = %lu\n", (LSIZE)blocksize);
488 LOGDBG1(
"dimensions (x, y) %u, %u\n", x, y);
489 auto pdata = (uint8_t*)data.data();
491 size_t outsize = x * y * 2;
492 uint16_t* outdata = (uint16_t*)output->allocData(outsize);
493 LOGDBG1(
"offset of RAW data = %u\n", current_offset);
497 auto ret = unpack.unpack_le12to16(outdata, outsize,
501 current_offset += blocksize;
507 }
while(current_offset < data.
size());
510 output->setPhotometricInterpretation(data.getPhotometricInterpretation());
513 data.setWhiteLevel((1 << 12) - 1);
516 LOGDBG1(
"ORF: decompress\n");
518 OlympusDecompressor decomp((
const uint8_t*)data.data(),
520 RawDataPtr dData = decomp.decompress();
523 dData->setPhotometricInterpretation(data.getPhotometricInterpretation());
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.
std::shared_ptr< Stream > Ptr
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
::or_error _addThumbnailFromStream(uint32_t offset, uint32_t len, std::vector< uint32_t > &list)
Add a thumbnail from a stream.
virtual ::or_error _enumThumbnailSizes(std::vector< uint32_t > &list) override
List the thumbnails in the IFD.
IfdFileContainer * m_container
::or_error _getRawDataFromDir(RawData &data, const IfdDir::Ref &dir)
Load the compressed raw data from a standard location in an IFD.
::or_error _addThumbnailFromEntry(const IfdEntry::Ref &e, off_t offset, std::vector< uint32_t > &list)
Add the thumbnail found in the IfdEntry.
::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.
Internals::IfdDir::Ref exifIfd()
Get the Exif IFD.
Internals::IfdDir::Ref cfaIfd()
Get the IFD containing the CFA.
Type type() const
Accessor for the type.
or_error
Error codes returned by libopenraw.
@ OR_DATA_TYPE_COMPRESSED_RAW
@ OR_OPTIONS_DONT_DECOMPRESS
Global namespace for libopenraw.
::or_error _enumThumbnailSizes(std::vector< uint32_t > &list) override
List the thumbnails in the IFD.
virtual ::or_error _getRawData(RawData &data, uint32_t options) override
Get the RAW data.