libopenraw  0.3.7
raffile.cpp
1 /* -*- mode:c++; tab-width:4; c-basic-offset:4 -*- */
2 /*
3  * libopenraw - raffile.cpp
4  *
5  * Copyright (C) 2011-2022 Hubert Figuière
6  *
7  * This library is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation, either version 3 of
10  * the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library. If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <stddef.h>
23 #include <sys/types.h>
24 #include <algorithm>
25 #include <cstdint>
26 
27 #include <memory>
28 
29 #include <libopenraw/cameraids.h>
30 #include <libopenraw/debug.h>
31 #include <libopenraw/metadata.h>
32 
33 #include "rawdata.hpp"
34 #include "rawfile.hpp"
35 #include "metavalue.hpp"
36 
37 #include "ifd.hpp"
38 #include "ifddir.hpp"
39 #include "ifdentry.hpp"
40 #include "ifdfilecontainer.hpp"
41 #include "rawfile_private.hpp"
42 #include "raffile.hpp"
43 #include "rafcontainer.hpp"
44 #include "rafmetacontainer.hpp"
45 #include "jfifcontainer.hpp"
46 #include "makernotedir.hpp"
47 #include "unpack.hpp"
48 #include "trace.hpp"
49 #include "io/streamclone.hpp"
50 #include "xtranspattern.hpp"
51 
52 namespace OpenRaw {
53 namespace Internals {
54 
55 #define OR_MAKE_FUJIFILM_TYPEID(camid) \
56  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_FUJIFILM, camid)
57 
58 /* taken from dcraw, by default */
59 static const BuiltinColourMatrix s_matrices[] = {
60  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F550EXR),
61  0,
62  0,
63  { 1369, -5358, -1474, -3369, 11600, 1998, -132, 1554, 4395 } },
64  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F700),
65  0,
66  0,
67  { 10004, -3219, -1201, -7036, 15047, 2107, -1863, 2565, 7736 } },
68  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F810),
69  0,
70  0,
71  { 11044, -3888, -1120, -7248, 15168, 2208, -1531, 2277, 8069 } },
72  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_E900),
73  0,
74  0,
75  { 9183, -2526, -1078, -7461, 15071, 2574, -2022, 2440, 8639 } },
76  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S2PRO),
77  128,
78  0,
79  { 12492, -4690, -1402, -7033, 15423, 1647, -1507, 2111, 7697 } },
80  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S3PRO),
81  0,
82  0,
83  { 11807, -4612, -1294, -8927, 16968, 1988, -2120, 2741, 8006 } },
84  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5PRO),
85  0,
86  0,
87  { 12300, -5110, -1304, -9117, 17143, 1998, -1947, 2448, 8100 } },
88  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5000),
89  0,
90  0,
91  { 8754, -2732, -1019, -7204, 15069, 2276, -1702, 2334, 6982 } },
92  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5600),
93  0,
94  0,
95  { 9636, -2804, -988, -7442, 15040, 2589, -1803, 2311, 8621 } },
96  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S9500),
97  0,
98  0,
99  { 10491, -3423, -1145, -7385, 15027, 2538, -1809, 2275, 8692 } },
100  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6000FD),
101  0,
102  0,
103  { 12628, -4886, -1401, -6860, 14997, 1962, -2198, 2782, 7091 } },
104  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6500FD),
105  0,
106  0,
107  { 12628, -4887, -1401, -6861, 14996, 1962, -2198, 2782, 7091 } },
108  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_SL1000),
109  0,
110  0,
111  { 11705, -4262, -1107, -2282, 10791, 1709, -555, 1713, 4945 } },
112  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS10),
113  0,
114  0xf68,
115  { 12440, -3954, -1183, -1123, 9674, 1708, -83, 1614, 4086 } },
116  // HS33EXR is an alias of this.
117  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS30EXR),
118  0,
119  0,
120  { 1369, -5358, -1474, -3369, 11600, 1998, -132, 1554, 4395 } },
121  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS50EXR),
122  0,
123  0,
124  { 12085, -4727, -953, -3257, 11489, 2002, -511, 2046, 4592 } },
125  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100),
126  0,
127  0,
128  { 12161, -4457, -1069, -5034, 12874, 2400, -795, 1724, 6904 } },
129  // From DNG Convert 7.4
130  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S),
131  0,
132  0,
133  { 10592, -4262, -1008, -3514, 11355, 2465, -870, 2025, 6386 } },
134  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100T),
135  0,
136  0,
137  { 10592, -4262, -1008, -3514, 11355, 2465, -870, 2025, 6386 } },
138  // From DNG Converter 10.3
139  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100F),
140  0,
141  0,
142  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
143  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100V),
144  0,
145  0,
146  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
147  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X10),
148  0,
149  0,
150  { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
151  // From DNG Convert 7.4
152  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20),
153  0,
154  0,
155  { 11768, -4971, -1133, -4904, 12927, 2183, -480, 1723, 4605 } },
156  // From DNG Convert 8.7-rc
157  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30),
158  0,
159  0,
160  { 12328, -5256, -1144, -4469, 12927, 1675, -87, 1291, 4351 } },
161  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X70),
162  0,
163  0,
164  { 10450, -4329, -878, -3217, 11105, 2421, -752, 1758, 6519 } },
165  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1),
166  0,
167  0,
168  { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
169  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO2),
170  0,
171  0,
172  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
173  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO3),
174  0,
175  0,
176  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
177  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA1),
178  0,
179  0,
180  { 11086, -4555, -839, -3512, 11310, 2517, -815, 1341, 5940 } },
181  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA10),
182  0,
183  0,
184  { 11540, -4999, -991, -2949, 10963, 2278, -382, 1049, 5605 } },
185  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA2),
186  0,
187  0,
188  { 10763, -4560, -917, -3346, 11311, 2322, -475, 1135, 5843 } },
189  // From DNG Converter 10.3
190  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA3),
191  0,
192  0,
193  { 12407, -5222, -1086, -2971, 11116, 2120, -294, 1029, 5284 } },
194  // From DNG Converter 10.3
195  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA5),
196  0,
197  0,
198  { 11673, -476, -1041, -3988, 12058, 2166, -771, 1417, 5569 } },
199  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA7),
200  0,
201  0,
202  { 15055, -7391, -1274, -4062, 12071, 2238, -610, 1217, 6147 } },
203  // From DNG Converter 10.3
204  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ1),
205  0,
206  0,
207  { 9252, -2704, -1064, -5893, 14265, 1717, -1101, 2341, 4349 } },
208  // From DNG Converter 10.3
209  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ2),
210  0,
211  0,
212  { 9252, -2704, -1064, -5893, 14265, 1717, -1101, 2341, 4349 } },
213  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1),
214  0,
215  0,
216  { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
217  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2),
218  0,
219  0,
220  { 8458, -2451, -855, -4597, 12447, 2407, -1475, 2482, 6526 } },
221  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2S),
222  0,
223  0,
224  { 11562, -5118, -961, -3022, 11007, 2311, -525, 1569, 6097 } },
225  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE3),
226  0,
227  0,
228  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
229  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE4),
230  0,
231  0,
232  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
233  // From DNG Converter 10.3
234  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH1),
235  0,
236  0,
237  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
238  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2),
239  0,
240  0,
241  { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } },
242  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2S),
243  0,
244  0,
245  { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } },
246  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1),
247  0,
248  0,
249  { 10413, -3996, -993, -3721, 11640, 2361, -733, 1540, 6011 } },
250  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1),
251  0,
252  0,
253  { 8458, -2451, -855, -4597, 12447, 2407, -1475, 2482, 6526 } },
254  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT10),
255  0,
256  0,
257  { 8458, -2451, -855, -4597, 12447, 2407, -1475, 2482, 6526 } },
258  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT100),
259  0,
260  0,
261  { 11673, -476, -1041, -3988, 12058, 2166, -771, 1417, 5569 } },
262  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT2),
263  0,
264  0,
265  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
266  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT20),
267  0,
268  0,
269  { 11434, -4948, -1210, -3746, 12042, 1903, -666, 1479, 5235 } },
270  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT200),
271  0,
272  0,
273  { 15055, -7391, -1274, -4062, 12071, 2238, -610, 1217, 6147 } },
274  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT3),
275  0,
276  0,
277  { 16393, -7740, -1436, -4238, 12131, 2371, -633, 1424, 6553 } },
278  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30),
279  0,
280  0,
281  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
282  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30_II),
283  0,
284  0,
285  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
286  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT4),
287  0,
288  0,
289  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
290  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT5),
291  0,
292  0,
293  { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } },
294  // From DNG Converter 7.1-rc
295  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS1),
296  0,
297  0,
298  { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
299  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS10),
300  0,
301  0,
302  { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } },
303  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF1),
304  0,
305  0,
306  { 13509, -6199, -1254, -4430, 12733, 1865, -331, 1441, 5022 } },
307  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF10),
308  0,
309  0,
310  { 11673, -476, -1041, -3988, 12058, 2166, -771, 1417, 5569 } },
311  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S200EXR),
312  512,
313  0x3fff,
314  { 11401, -4498, -1312, -5088, 12751, 2613, -838, 1568, 5941 } },
315  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S100FS),
316  512,
317  0x3fff,
318  { 11521, -4355, -1065, -6524, 13768, 3059, -1466, 1984, 6045 } },
319  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50S),
320  0,
321  0,
322  { 11756, -4754, -874, -3056, 11045, 2305, -381, 1457, 6006 } },
323  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50S_II),
324  0,
325  0,
326  { 11756, -4754, -874, -3056, 11045, 2305, -381, 1457, 6006 } },
327  // For now we assume it is the same sensor as the GFX50S
328  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50R),
329  0,
330  0,
331  { 11756, -4754, -874, -3056, 11045, 2305, -381, 1457, 6006 } },
332  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX100),
333  0,
334  0,
335  { 16212, -8423, -1583, -4336, 12583, 1937, -195, 726, 6199 } },
336  { OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX100S),
337  0,
338  0,
339  { 16212, -8423, -1583, -4336, 12583, 1937, -195, 726, 6199 } },
340 
341  { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
342 };
343 
344 const RawFile::camera_ids_t RafFile::s_def[] = {
345  { "GFX 50S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50S) },
346  { "GFX50S II", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50S_II) },
347  { "GFX 50R", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX50R) },
348  { "GFX 100", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX100) },
349  { "GFX100S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_GFX100S) },
350  { "FinePix F550EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F550EXR) },
351  { "FinePix F700 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F700) },
352  { "FinePix F810 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_F810) },
353  { "FinePix E900 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_E900) },
354  { "FinePixS2Pro", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S2PRO) },
355  { "FinePix S3Pro ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S3PRO) },
356  { "FinePix S5Pro ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5PRO) },
357  { "FinePix S5000 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5000) },
358  { "FinePix S5600 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S5600) },
359  { "FinePix S6000fd", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6000FD) },
360  { "FinePix S6500fd", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S6500FD) },
361  { "FinePix S9500 ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S9500) },
362  { "FinePix SL1000", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_SL1000) },
363  { "FinePix HS10 HS11", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS10) },
364  { "FinePix HS30EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS30EXR) },
365  { "FinePix HS33EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS33EXR) },
366  { "FinePix HS50EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_HS50EXR) },
367  { "FinePix S100FS ", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S100FS) },
368  { "FinePix S200EXR", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_S200EXR) },
369  { "FinePix X100", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100) },
370  { "X10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X10) },
371  { "X20", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20) },
372  { "X30", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30) },
373  { "X70", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X70) },
374  { "X-Pro1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1) },
375  { "X-Pro2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO2) },
376  { "X-Pro3", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO3) },
377  { "X-S1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS1) },
378  { "X-S10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS10) },
379  { "X-A1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA1) },
380  { "X-A10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA10) },
381  { "X-A2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA2) },
382  { "X-A3", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA3) },
383  { "X-A5", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA5) },
384  { "X-A7", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XA7) },
385  { "XQ1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ1) },
386  { "XQ2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ2) },
387  { "X-E1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1) },
388  { "X-E2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2) },
389  { "X-E2S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2S) },
390  { "X-E3", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE3) },
391  { "X-E4", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE4) },
392  { "X-M1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1) },
393  { "X-T1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1) },
394  { "X-T10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT10) },
395  { "X-T100", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT100) },
396  { "X-T2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT2) },
397  { "X-T20", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT20) },
398  { "X-T200", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT200) },
399  { "X-T3", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT3) },
400  { "X-T30", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30) },
401  { "X-T30 II", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30_II) },
402  { "X-T4", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT4) },
403  { "X-T5", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT5) },
404  { "XF1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF1) },
405  { "XF10", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XF10) },
406  { "X100S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S) },
407  { "X100T", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100T) },
408  { "X100F", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100F) },
409  { "X100V", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100V) },
410  { "X-H1", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH1) },
411  { "X-H2", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2) },
412  { "X-H2S", OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2S) },
413 
414  { nullptr, 0 }
415 };
416 
417 RawFile *RafFile::factory(const IO::Stream::Ptr &s)
418 {
419  return new RafFile(s);
420 }
421 
422 RafFile::RafFile(const IO::Stream::Ptr &s)
423  : RawFile(OR_RAWFILE_TYPE_RAF), m_io(s), m_container(new RafContainer(s))
424 {
425  _setIdMap(s_def);
426  _setMatrices(s_matrices);
427 }
428 
429 RafFile::~RafFile()
430 {
431  delete m_container;
432 }
433 
434 IfdDir::Ref RafFile::_locateMainIfd()
435 {
436  if (!m_mainIfd) {
437  JfifContainer *jpegPreview = m_container->getJpegPreview();
438  if (!jpegPreview) {
439  return IfdDir::Ref();
440  }
441  m_mainIfd = jpegPreview->getIfdDirAt(0);
442  }
443  return m_mainIfd;
444 }
445 
446 ::or_error RafFile::_enumThumbnailSizes(std::vector<uint32_t> &list)
447 {
449 
450  JfifContainer *jpegPreview = m_container->getJpegPreview();
451  if (!jpegPreview) {
452  return OR_ERROR_NOT_FOUND;
453  }
454 
455  uint32_t x, y;
456  if (jpegPreview->getDimensions(x, y)) {
457  uint32_t size = std::max(x, y);
458 
459  list.push_back(size);
460  _addThumbnail(size, ThumbDesc(x, y, OR_DATA_TYPE_JPEG,
461  m_container->getJpegOffset(),
462  m_container->getJpegLength()));
463  ret = OR_ERROR_NONE;
464  }
465  IfdDir::Ref dir = jpegPreview->getIfdDirAt(1);
466  if (!dir) {
467  return ret;
468  }
469 
470  // XXX check why this as it appear that if true there won't be
471  // and thumbnail.
472  auto result = dir->getIntegerValue(IFD::EXIF_TAG_IMAGE_WIDTH);
473  if (result) {
474  x = result.value();
475  result = dir->getIntegerValue(IFD::EXIF_TAG_IMAGE_LENGTH);
476  y = result.value_or(0);
477  }
478 
479  if (result.empty()) {
480  result =
481  dir->getValue<uint32_t>(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT);
482  if (result.empty()) {
483  return ret;
484  }
485  uint32_t jpeg_offset = result.value() + jpegPreview->exifOffset();
486 
487  result = dir->getValue<uint32_t>(IFD::EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
488  if (result.empty()) {
489  return ret;
490  }
491  uint32_t jpeg_size = result.value();
492 
493  auto s = std::make_shared<IO::StreamClone>(jpegPreview->file(), jpeg_offset);
494  auto thumb = std::make_unique<JfifContainer>(s, 0);
495 
496  if (thumb->getDimensions(x, y)) {
497  uint32_t size = std::max(x, y);
498 
499  list.push_back(size);
500  _addThumbnail(size,
502  jpeg_offset + m_container->getJpegOffset(),
503  jpeg_size));
504  ret = OR_ERROR_NONE;
505  }
506  }
507 
508  return ret;
509 }
510 
511 RawContainer *RafFile::getContainer() const
512 {
513  return m_container;
514 }
515 
516 bool
517 RafFile::isXTrans(RawFile::TypeId type_) const
518 {
519  switch (type_) {
520  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO1):
521  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO2):
522  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XPRO3):
523  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE1):
524  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2):
525  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE2S):
526  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE3):
527  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XE4):
528  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH1):
529  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2):
530  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XH2S):
531  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XM1):
532  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ1):
533  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XQ2):
534  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT1):
535  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT10):
536  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT2):
537  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT20):
538  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT3):
539  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30):
540  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT30_II):
541  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT4):
542  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XT5):
543  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100S):
544  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100T):
545  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100F):
546  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X100V):
547  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X20):
548  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X30):
549  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_X70):
550  case OR_MAKE_FUJIFILM_TYPEID(OR_TYPEID_FUJIFILM_XS10):
551  return true;
552 
553  default:
554  return false;
555  }
556 }
557 
558 ::or_error RafFile::_getRawData(RawData &data, uint32_t /*options*/)
559 {
561 
562  RafMetaContainer *meta = m_container->getMetaContainer();
563  if (!meta) {
564  LOGERR("RAF: Can't get meta container\n");
565  return ret;
566  }
567 
568  RafMetaValue::Ref value = meta->getValue(RAF_TAG_SENSOR_DIMENSION);
569  if (!value) {
570  // use this tag if the other is missing
571  value = meta->getValue(RAF_TAG_IMG_HEIGHT_WIDTH);
572  }
573  uint32_t dims = value->get().getUInteger(0);
574  uint16_t h = (dims & 0xFFFF0000) >> 16;
575  uint16_t w = (dims & 0x0000FFFF);
576 
577  value = meta->getValue(RAF_TAG_RAW_INFO);
578  uint32_t rawProps = value->get().getUInteger(0);
579  // TODO re-enable if needed.
580  // uint8_t layout = (rawProps & 0xFF000000) >> 24 >> 7; // MSBit in byte.
581  uint8_t compressed = ((rawProps & 0xFF0000) >> 16) & 8; // 8 == compressed
582 
583  // printf("layout %x - compressed %x\n", layout, compressed);
584 
586  data.setDimensions(w, h);
587  if (isXTrans(typeId())) {
588  data.setMosaicInfo(XTransPattern::xtransPattern());
589  } else {
590  data.setCfaPatternType(OR_CFA_PATTERN_GBRG);
591  }
592  // TODO actually read the 2048.
593  // TODO make sure this work for the other file formats...
594  size_t byte_size = m_container->getCfaLength() - 2048;
595  size_t fetched = 0;
596  off_t offset = m_container->getCfaOffset() + 2048;
597 
598  uint32_t finaldatalen = 2 * h * w;
599  bool is_compressed = byte_size < finaldatalen; //(compressed == 8);
600  uint32_t datalen = (is_compressed ? byte_size : finaldatalen);
601  void *buf = data.allocData(finaldatalen);
602 
603  LOGDBG2("byte_size = %lu finaldatalen = %u compressed = %u", (LSIZE)byte_size,
604  finaldatalen, compressed);
605 
606  ret = OR_ERROR_NONE;
607 
608  if (is_compressed) {
609  Unpack unpack(w, IFD::COMPRESS_NONE);
610  size_t blocksize = unpack.block_size();
611  std::unique_ptr<uint8_t[]> block(new uint8_t[blocksize]);
612  uint16_t *outdata = (uint16_t *)data.data();
613  size_t outsize = finaldatalen;
614  size_t got;
615  do {
616  got = m_container->fetchData(block.get(), offset, blocksize);
617  fetched += got;
618  offset += got;
619 
620  if (got) {
621  size_t out;
622  or_error err = unpack.unpack_be12to16(outdata, outsize,
623  block.get(), got, out);
624  outdata += out / 2;
625  outsize -= out;
626  if (err != OR_ERROR_NONE) {
627  LOGDBG2("error is %d\n", static_cast<int>(err));
628  ret = err;
629  break;
630  }
631  }
632  } while ((got != 0) && (fetched < datalen));
633  } else {
634  m_container->fetchData(buf, offset, datalen);
635  }
636 
637  return ret;
638 }
639 
640 MetaValue *RafFile::_getMetaValue(int32_t meta_index)
641 {
642  if (META_INDEX_MASKOUT(meta_index) == META_NS_EXIF ||
643  META_INDEX_MASKOUT(meta_index) == META_NS_TIFF) {
644 
645  JfifContainer *jpegPreview = m_container->getJpegPreview();
646  if (!jpegPreview) {
647  LOGERR("RAF: Can't get JPEG preview\n");
648  return nullptr;
649  }
650 
651  IfdDir::Ref dir = jpegPreview->mainIfd();
652  IfdEntry::Ref e = dir->getEntry(META_NS_MASKOUT(meta_index));
653  if (e) {
654  return dir->makeMetaValue(*e);
655  }
656  }
657 
658  return nullptr;
659 }
660 
661 void RafFile::_identifyId()
662 {
663  _setTypeId(_typeIdFromModel("FUJIFILM", m_container->getModel()));
664 }
665 }
666 }
void setDataType(DataType _type)
Set the data type.
Definition: bitmapdata.cpp:91
std::shared_ptr< Stream > Ptr
Definition: stream.hpp:47
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
Definition: ifddir.hpp:56
std::shared_ptr< IfdEntry > Ref
IfdEntry reference (ie shared pointer)
Definition: ifdentry.hpp:202
Generic interface for the RAW file container.
or_error unpack_be12to16(uint16_t *dest, size_t destsize, const uint8_t *src, size_t size, size_t &outsize) const
Definition: unpack.cpp:58
Metadata value.
Definition: metavalue.hpp:35
Represent camera raw data.
Definition: rawdata.hpp:38
virtual void setDimensions(uint32_t x, uint32_t y) override
Set the pixel dimensions of the bitmap.
Definition: rawdata.cpp:297
#define META_NS_MASKOUT(x)
Mask the namespace out.
Definition: metadata.h:56
#define META_INDEX_MASKOUT(x)
Mask the index out.
Definition: metadata.h:58
@ META_NS_TIFF
Definition: metadata.h:52
@ META_NS_EXIF
Definition: metadata.h:51
or_error
Error codes returned by libopenraw.
Definition: consts.h:42
@ OR_DATA_TYPE_JPEG
Definition: consts.h:84
@ OR_DATA_TYPE_RAW
Definition: consts.h:87
@ OR_RAWFILE_TYPE_RAF
Definition: consts.h:73
@ OR_ERROR_NONE
Definition: consts.h:43
@ OR_ERROR_NOT_FOUND
Definition: consts.h:48
Global namespace for libopenraw.
Definition: arwfile.cpp:29