27 #include <libopenraw/cameraids.h>
28 #include <libopenraw/debug.h>
30 #include "rawdata.hpp"
32 #include "io/streamclone.hpp"
33 #include "rw2file.hpp"
34 #include "rw2container.hpp"
35 #include "rawfile_private.hpp"
37 using namespace Debug;
43 #define OR_MAKE_PANASONIC_TYPEID(camid) \
44 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PANASONIC,camid)
45 #define OR_MAKE_LEICA_TYPEID(camid) \
46 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,camid)
49 static const BuiltinColourMatrix s_matrices[] = {
50 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_CM1),
53 { 8770, -3194, -820, -2871, 11281, 1803, -513, 1552, 4434 } },
54 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF1),
57 { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } },
58 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF2),
61 { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } },
62 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF3),
65 { 9051,-2468,-1204,-5212,13276,2121,-1197,2510,6890 } },
66 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF5),
69 { 8228,-2945,-660,-3938,11792,2430,-1094,2278,5793 } },
71 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF6),
74 { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } },
75 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF7),
78 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
79 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF8),
82 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
83 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF10),
86 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
87 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX1),
90 { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } },
91 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7),
94 { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } },
95 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7MK2),
98 { 7771, -3020, -629, -4029, 1195, 2345, -821, 1977, 6119 } },
99 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX8),
102 { 7564, -2263, -606, -3148, 11239, 2177, -540, 1435, 4853 } },
103 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX80),
106 { 7771, -3020, -629, -4029, 1195, 2345, -821, 1977, 6119 } },
107 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX800),
110 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
111 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX850),
114 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
115 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX9),
118 { 7564, -2263, -606, -3148, 11239, 2177, -540, 1435, 4853 } },
119 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ8),
122 { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } },
123 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ18),
126 { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } },
127 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ28),
130 { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } },
131 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ200),
134 { 8112,-2563,-740,-3730,11784,2197,-941,2075,4933 } },
135 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ2500),
138 { 7386, -2443, -743, -3437, 11864, 1757, -608, 1660, 4766 } },
139 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ30),
142 { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } },
143 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ300),
146 { 8378, -2798, -769, -3068, 11410, 1877, -538, 1792, 4623 } },
147 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ330),
150 { 8378, -2798, -769, -3068, 11410, 1877, -538, 1792, 4623 } },
151 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ35),
154 { 9938, -2780, -890, -4604, 12393, 2480, -1117, 2304, 4620 } },
155 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DMC_FZ45),
158 { 13639, -5535, -1371, -1698, 9633, 2430, 316, 1152, 4108 } },
159 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ50),
162 { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } },
163 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ70),
166 { 11532, -4324, -1066, -2375, 10847, 1749, -564, 1699, 4351 } },
167 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ100),
170 { 16197,-6146,-1761,-2393,10765,1869,366,2238,5248 } },
171 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DMC_FZ1000),
174 { 7830, -2696, -763, -3325, 11667, 1866, -641, 1712, 4824 } },
175 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_FZ1000M2),
178 { 9803, -4185, -992, -4066, 12578, 1628, -838, 1824, 5288 } },
179 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ150),
182 { 11904, -4541, -1189, -2355, 10899, 1662, -296, 1586, 4289 } },
183 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ80),
186 { 11532, -4324, -1066, -2375, 10847, 1749, -564, 1699, 4351 } },
187 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G1),
190 { 8199,-2065,-1056,-8124,16156,2033,-2458,3022,7220 } },
191 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G2),
194 { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } },
195 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G3),
198 { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } },
199 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G5),
202 { 7798,-2562,-740,-3879,11584,2613,-1055,2248,5434 } },
203 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G6),
206 { 8294, -2891, -651, -3869, 11590, 2595, -1183, 2267, 5352 } },
207 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G10),
210 { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } },
211 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G7),
214 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
215 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G80),
218 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
219 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G8),
222 { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
223 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G9),
226 { 7685, -2375, -634, -3687, 11700, 2249, -748, 1546, 5111 } },
227 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G95),
230 { 9657, -3963, -748, -3361, 11378, 2258, -568, 1415, 5158 } },
231 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G99),
234 { 9657, -3963, -748, -3361, 11378, 2258, -568, 1415, 5158 } },
235 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G100),
238 { 8370, -2869, -710, -3389, 11372, 2298, -640, 1599, 4887 } },
239 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH1),
242 { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } },
243 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH2),
246 { 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 } },
247 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH3),
250 { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } },
251 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH4),
254 { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } },
255 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5),
258 { 7641, -2336, -605, -3218, 11299, 2187, -485, 1338, 5121 } },
259 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5S),
262 { 6929, -2355, -708, -4192, 12534, 1828, -1097, 1989, 5195 } },
263 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5M2),
266 { 9300, -3659, -755, -2981, 10988, 2287, -190, 1077, 5016 } },
267 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH6),
270 { 7949, -3491, -710, -3435, 11681, 1977, -503, 1622, 5065 } },
271 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM1),
274 { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } },
275 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM5),
278 { 8238, -3244, -679, -3921, 11814, 2384, -836, 2022, 5852 } },
279 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LF1),
282 { 9379, -3267, -816, -3227, 11560, 1881, -926, 1928, 5340 } },
283 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX1),
286 { 10704, -4187, -1230, -8314, 15952, 2501, -920, 945, 8927 } },
287 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX2),
290 { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } },
291 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX3),
294 { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } },
295 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX5),
298 { 10909,-4295,-948,-1333,9306,2399,22,1738,4582 } },
299 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX7),
302 { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } },
303 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX10),
306 { 7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898 } },
307 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100),
310 { 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 } },
311 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100M2),
314 { 11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610 } },
315 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L1),
318 { 8054,-1885,-1025,-8349,16367,2040,-2805,3542,7629 } },
319 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L10),
322 { 8025,-1942,-1050,-7920,15904,2100,-2456,3005,7039 } },
323 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ70),
326 { 8802, -3135, -789, -3151, 11468, 1904, -550, 1745, 4810 } },
327 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS40),
330 { 8607, -2822, -808, -3755, 11930, 2049, -820, 2060, 5224 } },
331 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS50),
334 { 8802, -3135, -789, -3151, 11468, 1904, -550, 1745, 4810 } },
335 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS60),
338 { 8550, -2908, -842, -3195, 11529, 1881, -338, 1603, 4631 } },
339 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS100),
342 { 7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898 } },
343 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS200),
346 { 7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898 } },
347 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1),
350 { 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 } },
351 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1R),
354 { 11822, -5321, -1249, -5958, 15114, 766, -614, 1264, 7043 } },
355 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1H),
358 { 9397, -3719, -805, -5425, 13326, 2309, -972, 1715, 6034 } },
359 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S5),
362 { 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 } },
363 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S5M2),
366 { 10308, -4206, -783, -4088, 12102, 2229, -125, 1051, 5912 } },
367 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS70),
370 { 9052, -3117, -883, -3045, 11346, 1927, -205, 1520, 4730 } },
371 { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_ZS80),
374 { 12194, -5340, -1329, -3035, 11394, 1858, -50, 1418, 5219 } },
376 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX2),
379 { 11340, -4069, -1275, -7555, 15266, 2448, -2960, 3426, 7685 } },
380 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX3),
383 { 8054, -1886, -1025, -8348, 16367, 2040, -2805, 3542, 7630 } },
384 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_3),
387 { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } },
388 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_TYP109),
391 { 8844, -3538, -768, -3709, 11762, 2200, -698, 1792, 5220 } },
392 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_4),
395 { 8128, -2668, -655, -6134, 13307, 3161, -1782, 2568, 6083 } },
396 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_5),
399 { 10909, -4295, -948, -1333, 9306, 2399, 22, 1738, 4582 } },
400 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_1),
403 { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } },
404 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_4),
407 { 8112, -2563, -740, -3730, 11784, 2197, -941, 2075, 4933 } },
408 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_TYP114),
411 { 7830, -2696, -763, -3325, 11667, 1866, -641, 1712, 4824 } },
412 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_5),
415 { 9803, -4185, -992, -4066, 12578, 1628, -838, 1824, 5288 } },
416 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_CLUX),
419 { 7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898 } },
420 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_6),
423 { 10148, -3743, -991, -2837, 11366, 1659, -701, 1893, 4899 } },
424 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_7),
427 { 11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610 } },
428 { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_C_TYP112),
431 { 9379, -3267, -816, -3227, 11560, 1881, -926, 1928, 5340 } },
433 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
436 const IfdFile::camera_ids_t Rw2File::s_def[] = {
437 {
"DMC-CM1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_CM1) },
438 {
"DMC-GF1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF1) },
439 {
"DMC-GF2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF2) },
440 {
"DMC-GF3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF3) },
441 {
"DMC-GF5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF5) },
442 {
"DMC-GF6", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF6) },
443 {
"DMC-GF7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF7) },
444 {
"DMC-GF8", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF8) },
445 {
"DC-GF10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF10) },
446 {
"DMC-GX1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX1) },
447 {
"DMC-GX7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7) },
448 {
"DMC-GX7MK2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7MK2) },
449 {
"DC-GX7MK3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7MK3) },
450 {
"DMC-GX8", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX8) },
451 {
"DMC-GX80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX80) },
452 {
"DMC-GX85", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX85) },
453 {
"DC-GX800", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX800) },
454 {
"DC-GX850", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX850) },
455 {
"DC-GX880", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX880) },
456 {
"DC-GX9", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX9) },
457 {
"DMC-FZ8", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ8) },
458 {
"DMC-FZ1000", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DMC_FZ1000) },
459 {
"DC-FZ10002", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_FZ1000M2) },
460 {
"DC-FZ1000M2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_FZ1000M2) },
461 {
"DMC-FZ18", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ18) },
462 {
"DMC-FZ150", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ150) },
463 {
"DMC-FZ28", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ28) },
464 {
"DMC-FZ30", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ30) },
465 {
"DMC-FZ300", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ300) },
466 {
"DMC-FZ35", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ35) },
467 {
"DMC-FZ38", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ38) },
468 {
"DMC-FZ40", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DMC_FZ40) },
469 {
"DMC-FZ45", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DMC_FZ45) },
471 {
"DC-FZ45", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_FZ45) },
472 {
"DMC-FZ50", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ50) },
473 {
"DMC-FZ70", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ70) },
474 {
"DMC-FZ72", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ72) },
475 {
"DMC-FZ100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ100) },
476 {
"DMC-FZ200", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ200) },
477 {
"DMC-FZ2500", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ2500) },
479 {
"DMC-FZ2000", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ2000) },
480 {
"DMC-FZ330", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ330) },
481 {
"DC-FZ80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ80) },
482 {
"DC-FZ82", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ82) },
483 {
"DMC-G1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G1) },
484 {
"DMC-G2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G2) },
485 {
"DMC-G3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G3) },
486 {
"DMC-G5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G5) },
487 {
"DMC-G6", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G6) },
488 {
"DMC-G7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G7) },
489 {
"DMC-G70", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G70) },
490 {
"DMC-G10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G10) },
491 {
"DMC-G80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G80) },
492 {
"DMC-G81", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G81) },
493 {
"DC-G9", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G9) },
494 {
"DC-G90", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G90) },
495 {
"DC-G91", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G91) },
496 {
"DC-G95", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G95) },
497 {
"DC-G95D", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G95D) },
498 {
"DC-G99", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G99) },
499 {
"DC-G100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G100) },
500 {
"DC-G110", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_G110) },
501 {
"DMC-GH1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH1) },
502 {
"DMC-GH2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH2) },
503 {
"DMC-GH3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH3) },
504 {
"DMC-GH4", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH4) },
505 {
"DC-GH5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5) },
506 {
"DC-GH5S", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5S) },
507 {
"DC-GH5M2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5M2) },
508 {
"DC-GH6", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH6) },
509 {
"DMC-GM1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM1) },
510 {
"DMC-GM1S", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM1S) },
511 {
"DMC-GM5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM5) },
512 {
"DMC-LF1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LF1) },
513 {
"DMC-LX1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX1) },
514 {
"DMC-LX2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX2) },
515 {
"DMC-LX3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX3) },
516 {
"DMC-LX5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX5) },
517 {
"DMC-LX7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX7) },
518 {
"DMC-LX10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX10) },
519 {
"DMC-LX15", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX15) },
520 {
"DMC-LX100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100) },
521 {
"DC-LX100M2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100M2) },
522 {
"DMC-L1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L1) },
523 {
"DMC-L10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L10) },
524 {
"DC-S1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1) },
525 {
"DC-S1R", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1R) },
526 {
"DC-S1H", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S1H) },
527 {
"DC-S5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S5) },
528 {
"DC-S5M2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_S5M2) },
529 {
"DMC-TZ70", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ70) },
530 {
"DMC-ZS60", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS60) },
532 {
"DMC-TZ80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ80) },
533 {
"DMC-TZ81", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ81) },
534 {
"DMC-ZS100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS100) },
536 {
"DMC-TX1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TX1) },
537 {
"DMC-TZ100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ100) },
538 {
"DMC-TZ101", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ101) },
539 {
"DMC-TZ110", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ110) },
540 {
"DC-ZS200", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS200) },
542 {
"DC-TZ202", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ202) },
543 {
"DC-ZS80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_ZS80) },
545 {
"DC-TZ95", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_TZ95) },
546 {
"DC-TZ96", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_DC_TZ96) },
548 {
"DMC-ZS40", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS40) },
550 {
"DMC-TZ60", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ60) },
551 {
"DMC-TZ61", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ61) },
554 {
"DMC-TZ71", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ71) },
557 {
"DC-TZ90", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ90) },
559 {
"DIGILUX 2", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX2) },
560 {
"DIGILUX 3", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX3) },
561 {
"D-LUX 3", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_3) },
562 {
"D-LUX 4", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_4) },
563 {
"D-LUX 5", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_5) },
564 {
"D-LUX 6", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_6) },
565 {
"D-Lux 7", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_7) },
566 {
"V-LUX 1", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_1) },
567 {
"D-LUX (Typ 109)", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_TYP109) },
568 {
"V-LUX 4", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_4) },
569 {
"V-Lux 5", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_5) },
570 {
"V-LUX (Typ 114)", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_TYP114) },
571 {
"C-Lux", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_CLUX) },
572 {
"C (Typ 112)", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_C_TYP112) },
577 RawFile *Rw2File::factory(
const IO::Stream::Ptr & s)
579 return new Rw2File(s);
582 Rw2File::Rw2File(
const IO::Stream::Ptr & s)
588 _setMatrices(s_matrices);
589 m_container =
new Rw2Container(m_io, 0);
603 auto ifd = m_container->setDirectory(0);
605 ifd->setTagTable(raw_panasonic_tag_names);
613 auto _mainIfd = mainIfd();
615 LOGERR(
"IfdFile::_locateExifIfd() main IFD not found\n");
620 auto& jfif = getJpegContainer(_mainIfd, offset, size);
622 LOGDBG1(
"IfdFile::_locateExifIfd() JPEG container not found\n");
624 auto exifIfd = IfdFile::_locateExifIfd();
630 return jfif->exifIfd();
633 const std::unique_ptr<JfifContainer>&
634 Rw2File::getJpegContainer(
const IfdDir::Ref& dir, uint32_t& offset, uint32_t& size)
637 m_jfif_offset = _getJpegThumbnailOffset(dir, m_jfif_size);
638 if (m_jfif_size == 0) {
641 LOGDBG1(
"Jpeg offset: %u\n", m_jfif_offset);
644 m_jfif = std::make_unique<JfifContainer>(s, 0);
646 offset = m_jfif_offset;
651 ::or_error Rw2File::_locateThumbnail(
const IfdDir::Ref & dir,
652 std::vector<uint32_t> &list)
657 auto& jfif = getJpegContainer(dir, offset, size);
662 auto jdir = jfif->getIfdDirAt(1);
665 jdir->getValue<uint32_t>(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH).value_or(0);
666 auto result = jdir->getValue<uint32_t>(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT);
667 LOGDBG1(
"byte count %u\n", byte_count);
668 LOGASSERT(result.has_value());
669 if (result.has_value()) {
670 auto toffset = result.value();
671 LOGDBG1(
"toffset %u\n", toffset);
672 uint32_t tnail_offset = offset + toffset + jfif->exifOffset();
673 auto s = std::make_shared<IO::StreamClone>(m_io, tnail_offset);
674 auto tnail = std::make_unique<JfifContainer>(s, 0);
678 if (tnail->getDimensions(x, y)) {
679 uint32_t dim = std::max(x, y);
680 _addThumbnail(dim, ThumbDesc(x, y,
OR_DATA_TYPE_JPEG, tnail_offset, byte_count));
689 if (jfif->getDimensions(x,y)) {
690 LOGDBG1(
"JPEG dimensions x=%u y=%u\n", x, y);
691 uint32_t dim = std::max(x, y);
699 uint32_t Rw2File::_getJpegThumbnailOffset(
const IfdDir::Ref& dir, uint32_t & len)
701 IfdEntry::Ref e = dir->getEntry(IFD::RW2_TAG_JPEG_FROM_RAW);
704 LOGDBG1(
"JpegFromRaw not found\n");
707 uint32_t offset = e->offset();
713 ::or_error Rw2File::_getRawData(RawData & data, uint32_t )
716 const IfdDir::Ref & _cfaIfd = cfaIfd();
718 LOGDBG1(
"cfa IFD not found\n");
722 LOGDBG1(
"_getRawData()\n");
724 uint32_t byte_length = 0;
726 auto result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_STRIP_OFFSETS);
728 offset = result.value();
729 byte_length = m_container->file()->filesize() - offset;
732 result = _cfaIfd->getIntegerValue(IFD::EXIF_TAG_STRIP_OFFSETS);
733 if (result.empty()) {
734 LOGDBG1(
"offset not found\n");
737 offset = result.value();
738 result = _cfaIfd->getIntegerValue(IFD::EXIF_TAG_STRIP_BYTE_COUNTS);
739 if (result.empty()) {
740 LOGDBG1(
"byte len not found\n");
743 byte_length = result.value();
746 result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_SENSOR_WIDTH);
747 if (result.empty()) {
748 LOGDBG1(
"X not found\n");
751 uint32_t x = result.value();
753 result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_SENSOR_HEIGHT);
754 if (result.empty()) {
755 LOGDBG1(
"Y not found\n");
758 uint32_t y = result.value();
762 void *p = data.allocData(byte_length);
763 size_t real_size = m_container->fetchData(p, offset,
765 if (real_size < byte_length) {
766 LOGDBG1(
"adjusting size");
767 data.adjustSize(real_size);
770 if ((x * y * 2) == real_size) {
772 }
else if ((x * y * 3 / 2) == real_size) {
777 auto v = _cfaIfd->getValue<uint16_t>(RW2_TAG_IMAGE_COMPRESSION);
779 data.setCompression(v.value());
783 auto pattern = _cfaIfd->getValue<uint16_t>(RW2_TAG_IMAGE_CFAPATTERN);
785 LOGERR(
"Pattern not found.\n");
787 auto v = pattern.value();
790 data.setCfaPatternType(OR_CFA_PATTERN_RGGB);
793 data.setCfaPatternType(OR_CFA_PATTERN_GRBG);
796 data.setCfaPatternType(OR_CFA_PATTERN_GBRG);
799 data.setCfaPatternType(OR_CFA_PATTERN_BGGR);
802 LOGERR(
"Pattern is %u (UNKNOWN).\n", v);
806 data.setDimensions(x, y);
807 auto bpc = _cfaIfd->getValue<uint16_t>(RW2_TAG_IMAGE_BITSPERSAMPLE).value_or(0);
812 LOGDBG1(
"In size is %ux%u\n", data.width(), data.height());
815 x = _cfaIfd->getValue<uint16_t>(IFD::RW2_TAG_SENSOR_LEFTBORDER).value_or(0);
816 y = _cfaIfd->getValue<uint16_t>(IFD::RW2_TAG_SENSOR_TOPBORDER).value_or(0);
817 auto v = _cfaIfd->getValue<uint16_t>(IFD::RW2_TAG_SENSOR_BOTTOMBORDER);
818 int32_t h = v.value_or(0);
824 v = _cfaIfd->getValue<uint16_t>(IFD::RW2_TAG_SENSOR_RIGHTBORDER);
825 int32_t w = v.value_or(0);
831 data.setActiveArea(x, y, w, h);
cloned stream. Allow reading from a different offset
std::shared_ptr< Stream > Ptr
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
or_error
Error codes returned by libopenraw.
@ OR_DATA_TYPE_COMPRESSED_RAW
@ OR_IFD_MAIN
Main (like in TIFF)
Global namespace for libopenraw.