25 #include <libopenraw/debug.h> 26 #include <libopenraw/cameraids.h> 27 #include <libopenraw/consts.h> 29 #include "cfapattern.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" 47 using namespace Debug;
52 #define OR_MAKE_OLYMPUS_TYPEID(camid) \ 53 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_OLYMPUS,camid) 56 static const BuiltinColourMatrix s_matrices[] = {
57 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E1),
60 { 11846,-4767,-945,-7027,15878,1089,-2699,4122,8311 } },
61 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E10),
64 { 12745,-4500,-1416,-6062,14542,1580,-1934,2256,6603 } },
65 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E3),
68 { 9487,-2875,-1115,-7533,15606,2010,-1618,2100,7389 } },
69 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E5),
72 { 11200,-3783,-1325,-4576,12593,2206,-695,1742,7504 } },
73 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E300),
76 { 7828,-1761,-348,-5788,14071,1830,-2853,4518,6557 } },
77 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E330),
80 { 8961,-2473,-1084,-7979,15990,2067,-2319,3035,8249 } },
81 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E400),
84 { 6169,-1483,-21,-7107,14761,2536,-2904,3580,8568 } },
85 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E410),
88 { 8856,-2582,-1026,-7761,15766,2082,-2009,2575,7469 } },
89 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E500),
92 { 8136,-1968,-299,-5481,13742,1871,-2556,4205,6630 } },
93 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E510),
96 { 8785,-2529,-1033,-7639,15624,2112,-1783,2300,7817 } },
97 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E620),
100 { 8453,-2198,-1092,-7609,15681,2008,-1725,2337,7824 } },
101 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP350),
104 { 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } },
105 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP500),
108 { 9493,-3415,-666,-5211,12334,3260,-1548,2262,6482 } },
109 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP510),
112 { 10593,-3607,-1010,-5881,13127,3084,-1200,1805,6721 } },
113 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP550),
116 { 11597,-4006,-1049,-5432,12799,2957,-1029,1750,6516 } },
117 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP1),
120 { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } },
121 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP2),
124 { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } },
125 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP3),
128 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
129 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL1),
132 { 11408,-4289,-1215,-4286,12385,2118,-387,1467,7787 } },
133 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL2),
136 { 15030,-5552,-1806,-3987,12387,1767,-592,1670,7023 } },
137 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL3),
140 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
141 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL5),
144 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
145 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL6),
148 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
149 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL7),
152 { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } },
153 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM1),
156 { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } },
157 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM2),
160 { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
161 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ1),
164 { 10901,-4095,-1074,-1141,9208,2293,-62,1417,5158 } },
165 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ10),
168 { 9777, -3483, -925, -2886, 11297, 1800, -602, 1663, 5134 } },
169 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ2),
172 { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } },
173 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5),
176 { 8380, -2630, -639, -2887, 725, 2496, -627, 1427, 5438 } },
177 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5II),
180 { 9422, -3258, -711, -2655, 10898, 2015, -512, 1354, 5512 } },
181 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1),
184 { 7687, -1984, -606, -4327, 11928, 2721, -1381, 2339, 6452 } },
185 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10),
188 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
189 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10II),
192 { 8380, -2630, -639, -2887, 10725, 2496, -627, 1427, 5438 } },
193 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1),
196 { 8360, -2420, -880, -3928, 12353, 1739, -1381, 2416, 5173 } },
197 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_PEN_F),
200 { 9476, -3182, -765, -2613, 10958, 1893, -449, 1315, 5268 } },
201 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SH2),
204 { 10156, -3425, -1077, -2611, 11177, 1624, -385, 1592, 5080 } },
205 { OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG4),
208 { 11426, -4159, -1126, -2066, 10678, 1593, -120, 1327, 4998 } },
210 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
215 {
"E-1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E1) },
216 {
"E-10 " , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E10) },
217 {
"E-3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E3) },
218 {
"E-5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E5) },
219 {
"E-300 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E300) },
220 {
"E-330 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E330) },
221 {
"E-400 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E400) },
222 {
"E-410 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E410) },
223 {
"E-500 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E500) },
224 {
"E-510 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E510) },
225 {
"E-620 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_E620) },
226 {
"SP350" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP350) },
227 {
"SP500UZ" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP500) },
228 {
"SP510UZ" , OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP510) },
229 {
"SP550UZ ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SP550) },
230 {
"E-P1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP1) },
231 {
"E-P2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP2) },
232 {
"E-P3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EP3) },
233 {
"E-PL1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL1) },
234 {
"E-PL2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL2) },
235 {
"E-PL3 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL3) },
236 {
"E-PL5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL5) },
237 {
"E-PL6 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL6) },
238 {
"E-PL7 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL7) },
239 {
"E-PL8 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPL8) },
240 {
"E-PM1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM1) },
241 {
"E-PM2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EPM2) },
242 {
"XZ-1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ1) },
243 {
"XZ-10 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ10) },
244 {
"XZ-2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_XZ2) },
245 {
"E-M5 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5) },
246 {
"E-M5MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM5II) },
247 {
"E-M1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1) },
248 {
"E-M1MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM1II) },
249 {
"E-M10 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10) },
250 {
"E-M10MarkII ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_EM10II) },
251 {
"STYLUS1 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_STYLUS1) },
252 {
"PEN-F ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_PEN_F) },
253 {
"SH-2 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_SH2) },
254 {
"TG-4 ", OR_MAKE_OLYMPUS_TYPEID(OR_TYPEID_OLYMPUS_TG4) },
258 RawFile *OrfFile::factory(
const IO::Stream::Ptr &s)
263 OrfFile::OrfFile(
const IO::Stream::Ptr &s)
264 :
IfdFile(s, OR_RAWFILE_TYPE_ORF,
false)
267 _setMatrices(s_matrices);
275 IfdDir::Ref OrfFile::_locateCfaIfd()
282 IfdDir::Ref OrfFile::_locateMainIfd()
284 return m_container->setDirectory(0);
287 ::or_error OrfFile::_enumThumbnailSizes(std::vector<uint32_t> &list)
289 auto err = OR_ERROR_NOT_FOUND;
291 err = IfdFile::_enumThumbnailSizes(list);
293 auto exif = exifIfd();
298 auto ifd = exif->getMakerNoteIfd();
302 auto makerNote = std::dynamic_pointer_cast<
MakerNoteDir>(ifd);
307 auto e = makerNote->getEntry(0x100);
309 auto val_offset = e->offset();
311 val_offset += makerNote->getMnoteOffset();
313 LOGDBG1(
"fetching JPEG\n");
315 std::make_shared<IO::StreamClone>(m_io, val_offset));
316 std::unique_ptr<JfifContainer> jfif(
new JfifContainer(s, 0));
320 jfif->getDimensions(x, y);
321 LOGDBG1(
"JPEG dimensions x=%d y=%d\n", x, y);
323 uint32_t dim = std::max(x, y);
325 _addThumbnail(dim,
ThumbDesc(x, y, OR_DATA_TYPE_JPEG,
326 val_offset, e->count()));
335 ::or_error OrfFile::_getRawData(
RawData & data, uint32_t options)
338 const IfdDir::Ref & _cfaIfd = cfaIfd();
339 err = _getRawDataFromDir(data, _cfaIfd);
340 if(err == OR_ERROR_NONE) {
342 uint32_t x = data.width();
343 uint32_t y = data.height();
344 uint32_t compression = 0;
345 if(data.
size() < x * y * 2) {
346 compression = ORF_COMPRESSION;
347 data.setCompression(ORF_COMPRESSION);
351 compression = data.compression();
353 switch(compression) {
354 case ORF_COMPRESSION:
355 if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
357 data.
size(), m_container, x, y);
374 uint32_t OrfFile::_translateCompressionType(IFD::TiffCompress tiffCompression)
376 if(tiffCompression == IFD::COMPRESS_CUSTOM) {
377 return ORF_COMPRESSION;
379 return (uint32_t)tiffCompression;
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
virtual RawDataPtr decompress() override
::or_cfa_pattern patternType() const
const CfaPattern * cfaPattern() const
void setDataType(DataType _type)
generic IFD based raw file.
virtual void setDimensions(uint32_t x, uint32_t y) override