/src/libraw/src/metadata/tiff.cpp
Line | Count | Source |
1 | | /* -*- C++ -*- |
2 | | * Copyright 2019-2025 LibRaw LLC (info@libraw.org) |
3 | | * |
4 | | LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, |
5 | | dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. |
6 | | LibRaw do not use RESTRICTED code from dcraw.c |
7 | | |
8 | | LibRaw is free software; you can redistribute it and/or modify |
9 | | it under the terms of the one of two licenses as you choose: |
10 | | |
11 | | 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 |
12 | | (See file LICENSE.LGPL provided in LibRaw distribution archive for details). |
13 | | |
14 | | 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 |
15 | | (See file LICENSE.CDDL provided in LibRaw distribution archive for details). |
16 | | |
17 | | */ |
18 | | |
19 | | #include "../../internal/dcraw_defs.h" |
20 | | #include "../../internal/libraw_cameraids.h" |
21 | | |
22 | | int LibRaw::parse_tiff_ifd(INT64 base) |
23 | 251k | { |
24 | 251k | unsigned entries, tag, type, len, plen = 16, utmp; |
25 | 251k | INT64 save; |
26 | 251k | int ifd, use_cm = 0, cfa, i, j, c, ima_len = 0; |
27 | 251k | char *cbuf, *cp; |
28 | 251k | uchar cfa_pat[16], cfa_pc[] = {0, 1, 2, 3}, tab[256]; |
29 | 251k | double fm[3][4], cc[4][4], cm[4][3], cam_xyz[4][3], num; |
30 | 251k | double ab[] = {1, 1, 1, 1}, asn[] = {0, 0, 0, 0}, xyz[] = {1, 1, 1}; |
31 | 251k | unsigned sony_curve[] = {0, 0, 0, 0, 0, 4095}; |
32 | 251k | unsigned *buf, sony_offset = 0, sony_length = 0, sony_key = 0; |
33 | 251k | struct jhead jh; |
34 | | |
35 | 251k | ushort *rafdata; |
36 | | |
37 | 251k | if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) |
38 | 68.4k | return 1; |
39 | 183k | ifd = tiff_nifds++; |
40 | 916k | for (j = 0; j < 4; j++) |
41 | 3.66M | for (i = 0; i < 4; i++) |
42 | 2.93M | cc[j][i] = i == j; |
43 | | |
44 | 183k | if (libraw_internal_data.unpacker_data.ifd0_offset == -1LL) |
45 | 32.7k | libraw_internal_data.unpacker_data.ifd0_offset = base; |
46 | | |
47 | 183k | entries = get2(); |
48 | 183k | if (entries > 512) |
49 | 21.9k | return 1; |
50 | | |
51 | 161k | INT64 fsize = ifp->size(); |
52 | | |
53 | 28.9M | while (entries--) |
54 | 28.8M | { |
55 | 28.8M | tiff_get(base, &tag, &type, &len, &save); |
56 | 28.8M | INT64 savepos = ftell(ifp); |
57 | 28.8M | if (len > 8 && savepos + len > 2 * fsize) |
58 | 22.3M | { |
59 | 22.3M | fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! |
60 | 22.3M | continue; |
61 | 22.3M | } |
62 | 6.48M | if (callbacks.exif_cb) |
63 | 0 | { |
64 | 0 | callbacks.exif_cb(callbacks.exifparser_data, |
65 | 0 | tag | (is_pana_raw ? 0x30000 : ((ifd + 1) << 20)), type, |
66 | 0 | len, order, ifp, base); |
67 | 0 | fseek(ifp, savepos, SEEK_SET); |
68 | 0 | } |
69 | 6.48M | if (!is_pana_raw) |
70 | 4.63M | { /* processing of EXIF tags that collide w/ PanasonicRaw tags */ |
71 | 4.63M | switch (tag) |
72 | 4.63M | { |
73 | 120k | case 0x0001: |
74 | 120k | if (len == 4) |
75 | 5.24k | is_pana_raw = get4(); |
76 | 120k | break; |
77 | 9.53k | case 0x000b: /* 11, Std. EXIF Software tag */ |
78 | 9.53k | fgets(software, 64, ifp); |
79 | 9.53k | if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) || |
80 | 9.17k | !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) || |
81 | 8.81k | !strcmp(software, "Digital Photo Professional")) |
82 | 806 | is_raw = 0; |
83 | 9.53k | break; |
84 | 4.02k | case 0x001c: /* 28, safeguard, probably not needed */ |
85 | 8.23k | case 0x001d: /* 29, safeguard, probably not needed */ |
86 | 10.5k | case 0x001e: /* 30, safeguard, probably not needed */ |
87 | 10.5k | cblack[tag - 0x001c] = get2(); |
88 | 10.5k | cblack[3] = cblack[1]; |
89 | 10.5k | break; |
90 | | |
91 | 26.2k | case 0x0111: /* 273, StripOffset */ |
92 | 26.2k | if (len > 1 && len < 16384) |
93 | 4.74k | { |
94 | 4.74k | INT64 sav = ftell(ifp); |
95 | 4.74k | tiff_ifd[ifd].strip_offsets = (INT64 *)calloc(len, sizeof(INT64)); |
96 | 4.74k | tiff_ifd[ifd].strip_offsets_count = len; |
97 | 3.04M | for (int ii = 0; ii < (int)len; ii++) |
98 | 3.03M | tiff_ifd[ifd].strip_offsets[ii] = get4() + base; |
99 | 4.74k | fseek(ifp, sav, SEEK_SET); // restore position |
100 | 4.74k | } |
101 | | /* fallback */ |
102 | 34.0k | case 0x0201: /* 513, JpegIFOffset */ |
103 | 34.3k | case 0xf007: // 61447 |
104 | 34.3k | tiff_ifd[ifd].offset = get4() + base; |
105 | 34.3k | if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) |
106 | 12.7k | { |
107 | 12.7k | fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET); |
108 | 12.7k | if (ljpeg_start(&jh, 1)) |
109 | 739 | { |
110 | 739 | if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 32803 && |
111 | 36 | tiff_ifd[ifd].comp == 7) // Sony/lossless compressed IFD |
112 | 14 | { |
113 | 14 | tiff_ifd[ifd].comp = 6; |
114 | 14 | tiff_ifd[ifd].bps = jh.bits; |
115 | 14 | tiff_ifd[ifd].samples = 1; |
116 | 14 | } |
117 | 725 | else if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 6 && |
118 | 91 | tiff_ifd[ifd].comp == 7 && tiff_ifd[ifd].samples == 3) // Sony/lossless YCbCr |
119 | 2 | { |
120 | 2 | tiff_ifd[ifd].comp = 6; |
121 | 2 | tiff_ifd[ifd].bps = jh.bits; |
122 | | // tiff_ifd[ifd].samples = 3; // no change |
123 | 2 | } |
124 | 723 | else |
125 | 723 | { |
126 | 723 | tiff_ifd[ifd].comp = 6; |
127 | 723 | tiff_ifd[ifd].bps = jh.bits; |
128 | 723 | tiff_ifd[ifd].t_width = jh.wide; |
129 | 723 | tiff_ifd[ifd].t_height = jh.high; |
130 | 723 | tiff_ifd[ifd].samples = jh.clrs; |
131 | 723 | if (!(jh.sraw || (jh.clrs & 1))) |
132 | 316 | tiff_ifd[ifd].t_width *= jh.clrs; |
133 | 723 | if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs) |
134 | 246 | { |
135 | 246 | tiff_ifd[ifd].t_width /= 2; |
136 | 246 | tiff_ifd[ifd].t_height *= 2; |
137 | 246 | } |
138 | 723 | i = order; |
139 | 723 | parse_tiff(tiff_ifd[ifd].offset + 12); |
140 | 723 | order = i; |
141 | 723 | } |
142 | 739 | } |
143 | 12.7k | } |
144 | 34.3k | break; |
145 | 4.63M | } |
146 | 4.63M | } |
147 | 1.84M | else |
148 | 1.84M | { /* processing Panasonic-specific "PanasonicRaw" tags */ |
149 | 1.84M | switch (tag) |
150 | 1.84M | { |
151 | 13.6k | case 0x0004: /* 4, SensorTopBorder */ |
152 | 13.6k | imgdata.sizes.raw_inset_crops[0].ctop = get2(); |
153 | 13.6k | break; |
154 | 2.58k | case 0x000a: /* 10, BitsPerSample */ |
155 | 2.58k | pana_bpp = get2(); |
156 | 2.58k | pana_bpp = LIM(pana_bpp, 8, 16); |
157 | 2.58k | break; |
158 | 2.38k | case 0x000b: /* 11, Compression */ |
159 | 2.38k | imPana.Compression = get2(); |
160 | 2.38k | break; |
161 | 1.52k | case 0x000e: /* 14, LinearityLimitRed */ |
162 | 4.54k | case 0x000f: /* 15, LinearityLimitGreen */ |
163 | 10.5k | case 0x0010: /* 16, LinearityLimitBlue */ |
164 | 10.5k | imgdata.color.linear_max[tag - 14] = get2(); |
165 | 10.5k | if (imgdata.color.linear_max[tag - 14] == 16383) |
166 | 80 | imgdata.color.linear_max[tag - 14] -= 64; |
167 | 10.5k | if (imgdata.color.linear_max[tag - 14] == 4095) |
168 | 148 | imgdata.color.linear_max[tag - 14] -= 16; |
169 | 10.5k | if (tag == 0x000f) // 15, LinearityLimitGreen |
170 | 3.02k | imgdata.color.linear_max[3] = imgdata.color.linear_max[1]; |
171 | 10.5k | break; |
172 | 2.37k | case 0x0013: /* 19, WBInfo */ |
173 | 2.37k | if ((i = get2()) > 0x100) |
174 | 750 | break; |
175 | 72.5k | for (c = 0; c < i; c++) |
176 | 70.8k | { |
177 | 70.8k | if ((j = get2()) < 0x100) |
178 | 20.6k | { |
179 | 20.6k | if (j >= 0) { |
180 | 20.6k | icWBC[j][0] = get2(); |
181 | 20.6k | icWBC[j][2] = get2(); |
182 | 20.6k | icWBC[j][1] = icWBC[j][3] = |
183 | 20.6k | 0x100; |
184 | 20.6k | } |
185 | 20.6k | } |
186 | 50.2k | else // light source out of EXIF numbers range |
187 | 50.2k | get4(); |
188 | 70.8k | } |
189 | 1.62k | break; |
190 | 1.06k | case 0x0018: /* 24, HighISOMultiplierRed */ |
191 | 2.64k | case 0x0019: /* 25, HighISOMultiplierGreen */ |
192 | 3.73k | case 0x001a: /* 26, HighISOMultiplierBlue */ |
193 | 3.73k | imPana.HighISOMultiplier[tag - 0x0018] = get2(); |
194 | 3.73k | break; |
195 | 1.94k | case 0x001c: /* 28, BlackLevelRed */ |
196 | 2.69k | case 0x001d: /* 29, BlackLevelGreen */ |
197 | 3.72k | case 0x001e: /* 30, BlackLevelBlue */ |
198 | 3.72k | pana_black[tag - 0x001c] = get2(); |
199 | 3.72k | break; |
200 | 1.22k | case 0x002d: /* 45, RawFormat */ |
201 | | /* pana_encoding: tag 0x002d (45dec) not used - DMC-LX1/FZ30/FZ50/L1/LX1/LX2 |
202 | | 2 - RAW DMC-FZ8/FZ18 |
203 | | 3 - RAW DMC-L10 |
204 | | 4 - RW2 for most other models, including G9 in "pixel shift off" mode and YUNEEC CGO4 |
205 | | (must add 15 to black levels for RawFormat == 4) |
206 | | 5 - RW2 DC-GH5s; G9 in "pixel shift on" mode |
207 | | 6 - RW2 DC-S1, DC-S1R in "pixel shift off" mode |
208 | | 7 - RW2 DC-S1R (probably DC-S1 too) in "pixel shift on" mode |
209 | | 8 - RW2 DC-GH6, DC-S5M2 |
210 | | */ |
211 | 1.22k | pana_encoding = get2(); |
212 | 1.22k | break; |
213 | 1.04k | case 0x002f: /* 47, CropTop */ |
214 | 1.04k | imgdata.sizes.raw_inset_crops[0].ctop = get2(); |
215 | 1.04k | break; |
216 | 2.24k | case 0x0030: /* 48, CropLeft */ |
217 | 2.24k | imgdata.sizes.raw_inset_crops[0].cleft = get2(); |
218 | 2.24k | break; |
219 | 1.26k | case 0x0031: /* 49, CropBottom */ |
220 | 1.26k | imgdata.sizes.raw_inset_crops[0].cheight = |
221 | 1.26k | get2() - imgdata.sizes.raw_inset_crops[0].ctop; |
222 | 1.26k | break; |
223 | 1.20k | case 0x0032: /* 50, CropRight */ |
224 | 1.20k | imgdata.sizes.raw_inset_crops[0].cwidth = |
225 | 1.20k | get2() - imgdata.sizes.raw_inset_crops[0].cleft; |
226 | 1.20k | break; |
227 | 773 | case 0x0037: /* 55, ISO if ISO in 0x8827 & ISO in 0x0017 == 65535 */ |
228 | 773 | if (iso_speed == 65535) |
229 | 65 | iso_speed = float(get4()); |
230 | 773 | break; |
231 | 1.65k | case 0x0039: |
232 | 1.65k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) |
233 | 565 | { |
234 | 565 | ushort cnt = get2(); |
235 | 565 | if (cnt > 6) |
236 | 224 | cnt = 6; |
237 | 2.01k | for (i = 0; i < cnt; i++) |
238 | 1.45k | pana8.tag39[i] = get4(); |
239 | 565 | } |
240 | 1.65k | break; |
241 | 1.30k | case 0x003A: |
242 | 1.30k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) |
243 | 531 | { |
244 | 531 | ushort cnt = get2(); |
245 | 531 | if (cnt > 6) |
246 | 315 | cnt = 6; |
247 | 2.52k | for (i = 0; i < cnt; i++) |
248 | 1.99k | { |
249 | 1.99k | get2(); |
250 | 1.99k | pana8.tag3A[i] = get2(); |
251 | 1.99k | } |
252 | 531 | } |
253 | 1.30k | break; |
254 | 1.83k | case 0x003B: |
255 | 1.83k | if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) |
256 | 475 | pana8.tag3B = get2(); |
257 | 1.83k | break; |
258 | 1.26k | case 0x003C: |
259 | 2.60k | case 0x003D: |
260 | 3.42k | case 0x003E: |
261 | 3.98k | case 0x003F: |
262 | 3.98k | if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) |
263 | 196 | pana8.initial[tag - 0x3c] = get2(); |
264 | 3.98k | break; |
265 | 4.03k | case 0x0040: |
266 | 4.03k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 70) |
267 | 397 | { |
268 | 397 | ushort count = get2(); |
269 | 397 | if (count > 17) count = 17; |
270 | 2.86k | for (i = 0; i < count; i++) |
271 | 2.46k | { |
272 | 2.46k | ushort v1 = get2(); |
273 | 2.46k | if (v1 > 16u) v1 = 16u; |
274 | 2.46k | pana8.tag40a[i] = v1; |
275 | 2.46k | ushort v2 = get2(); |
276 | 2.46k | if (v2 > 0xfffu) |
277 | 2.02k | v2 = 0xfffu; |
278 | 2.46k | pana8.tag40b[i] = v2; |
279 | 2.46k | } |
280 | 397 | } |
281 | 4.03k | break; |
282 | 1.82k | case 0x0041: |
283 | 1.82k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 36) |
284 | 326 | { |
285 | 326 | ushort count = get2(); |
286 | 326 | if (count > 17) |
287 | 189 | count = 17; |
288 | 3.73k | for (i = 0; i < count; i++) |
289 | 3.40k | { |
290 | 3.40k | ushort v1 = get2(); |
291 | 3.40k | if (v1 > 0x40u) v1 = 64; |
292 | 3.40k | pana8.tag41[i] = v1; |
293 | 3.40k | } |
294 | 326 | } |
295 | 1.82k | break; |
296 | 926 | case 0x0042: |
297 | 926 | if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) |
298 | 218 | { |
299 | 218 | ushort val = get2(); |
300 | 218 | if (val > 5) |
301 | 99 | val = 5; |
302 | 218 | pana8.stripe_count = val; |
303 | 218 | } |
304 | 926 | break; |
305 | 1.33k | case 0x0043: |
306 | 1.33k | if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) |
307 | 200 | { |
308 | 200 | ushort val = get2(); |
309 | 200 | if (val > 5) |
310 | 171 | val = 5; |
311 | 200 | pana8.tag43 = val; |
312 | 200 | } |
313 | 1.33k | break; |
314 | 1.10k | case 0x0044: |
315 | 1.10k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) |
316 | 199 | { |
317 | 199 | ushort count = get2(); |
318 | 199 | if (count > 5) |
319 | 68 | count = 5; |
320 | 584 | for (i = 0; i < count; i++) |
321 | 385 | pana8.stripe_offsets[i] = get4(); |
322 | 199 | } |
323 | 1.10k | break; |
324 | 1.19k | case 0x0045: |
325 | 1.19k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) |
326 | 436 | { |
327 | 436 | ushort count = get2(); |
328 | 436 | if (count > 5) |
329 | 226 | count = 5; |
330 | 1.72k | for (i = 0; i < count; i++) |
331 | 1.28k | pana8.stripe_left[i] = get4(); |
332 | 436 | } |
333 | 1.19k | break; |
334 | 994 | case 0x0046: |
335 | 994 | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) |
336 | 259 | { |
337 | 259 | ushort count = get2(); |
338 | 259 | if (count > 5) |
339 | 82 | count = 5; |
340 | 707 | for (i = 0; i < count; i++) |
341 | 448 | pana8.stripe_compressed_size[i] = get4(); |
342 | 259 | } |
343 | 994 | break; |
344 | 1.67k | case 0x0047: |
345 | 1.67k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) |
346 | 513 | { |
347 | 513 | ushort count = get2(); |
348 | 513 | if (count > 5) |
349 | 303 | count = 5; |
350 | 2.08k | for (i = 0; i < count; i++) |
351 | 1.57k | pana8.stripe_width[i] = get2(); |
352 | 513 | } |
353 | 1.67k | break; |
354 | 1.45k | case 0x0048: |
355 | 1.45k | if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) |
356 | 328 | { |
357 | 328 | ushort count = get2(); |
358 | 328 | if (count > 5) |
359 | 187 | count = 5; |
360 | 1.33k | for (i = 0; i < count; i++) |
361 | 1.00k | pana8.stripe_height[i] = get2(); |
362 | 328 | } |
363 | 1.45k | break; |
364 | 1.73k | case 0x011c: /* 284, Gamma */ |
365 | 1.73k | { |
366 | 1.73k | int n = get2(); |
367 | 1.73k | if (n >= 1024) |
368 | 674 | imPana.gamma = (float)n / 1024.0f; |
369 | 1.05k | else if (n >= 256) |
370 | 242 | imPana.gamma = (float)n / 256.0f; |
371 | 815 | else |
372 | 815 | imPana.gamma = (float)n / 100.0f; |
373 | 1.73k | } |
374 | 1.73k | break; |
375 | 17.0k | case 0x0120: /* 288, CameraIFD, contains tags 0x1xxx, 0x2xxx, 0x3xxx */ |
376 | 17.0k | { |
377 | 17.0k | unsigned sorder = order; |
378 | 17.0k | INT64 sbase = base; |
379 | 17.0k | base = ftell(ifp); |
380 | 17.0k | order = get2(); |
381 | 17.0k | fseek(ifp, 2, SEEK_CUR); |
382 | 17.0k | fseek(ifp, INT64(get4()) - 8LL, SEEK_CUR); |
383 | 17.0k | parse_tiff_ifd(base); |
384 | 17.0k | base = sbase; |
385 | 17.0k | order = sorder; |
386 | 17.0k | } |
387 | 17.0k | break; |
388 | 972 | case 0x0121: /* 289, Multishot, 0 is Off, 65536 is Pixel Shift */ |
389 | 972 | imPana.Multishot = get4(); |
390 | 972 | break; |
391 | 912 | case 0x1001: |
392 | 912 | if (imPana.Multishot == 0) { |
393 | 426 | imPana.Multishot = get4(); |
394 | 426 | if (imPana.Multishot) |
395 | 212 | imPana.Multishot += 65535; |
396 | 426 | } |
397 | 912 | break; |
398 | 2.69k | case 0x1100: |
399 | 2.69k | imPana.FocusStepNear = get2(); |
400 | 2.69k | break; |
401 | 467 | case 0x1101: |
402 | 467 | imPana.FocusStepCount = get2(); |
403 | 467 | break; |
404 | 291 | case 0x1105: |
405 | 291 | imPana.ZoomPosition = get4(); |
406 | 291 | break; |
407 | 2.48k | case 0x1201: |
408 | 2.48k | if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) { |
409 | 433 | imPana.LensManufacturer = fgetc(ifp); |
410 | 2.05k | } else if (type == 258) { |
411 | 791 | imPana.LensManufacturer = get4(); |
412 | 791 | if (imPana.LensManufacturer >= 257) { |
413 | 426 | ilm.LensMount = LIBRAW_MOUNT_LPS_L; |
414 | 426 | ilm.LensFormat = LIBRAW_FORMAT_FF; |
415 | 426 | } |
416 | 791 | } |
417 | 2.48k | break; |
418 | 2.38k | case 0x1202: |
419 | 2.38k | if (ilm.LensMount == LIBRAW_MOUNT_LPS_L) { |
420 | 644 | if ((utmp = get2())) ilm.LensID = utmp; |
421 | 1.73k | } else if ((imPana.LensManufacturer != 0xff) && |
422 | 1.60k | (imPana.LensManufacturer != 0xffffffff)) { |
423 | 1.00k | if ((utmp = (fgetc(ifp) << 8) | fgetc(ifp))) |
424 | 463 | ilm.LensID = (imPana.LensManufacturer << 16) + utmp; |
425 | 1.00k | } |
426 | 2.38k | break; |
427 | 488 | case 0x1203: /* 4611, FocalLengthIn35mmFormat, contained in 0x0120 |
428 | | CameraIFD */ |
429 | 488 | if (imgdata.lens.FocalLengthIn35mmFormat < 0.65f) |
430 | 246 | imgdata.lens.FocalLengthIn35mmFormat = get2(); |
431 | 488 | break; |
432 | 492 | case 0x2009: /* 8201, contained in 0x0120 CameraIFD */ |
433 | 492 | if ((pana_encoding == 4) || (pana_encoding == 5)) |
434 | 287 | { |
435 | 287 | i = MIN(8, len); |
436 | 287 | int permut[8] = {3, 2, 1, 0, 3 + 4, 2 + 4, 1 + 4, 0 + 4}; |
437 | 287 | imPana.BlackLevelDim = len; |
438 | 1.16k | for (j = 0; j < i; j++) |
439 | 873 | { |
440 | 873 | imPana.BlackLevel[permut[j]] = |
441 | 873 | (float)(get2()) / (float)(powf(2.f, 14.f - pana_bpp)); |
442 | 873 | } |
443 | 287 | } |
444 | 492 | break; |
445 | 344 | case 0x3420: /* 13344, WB_RedLevelAuto, contained in 0x0120 CameraIFD */ |
446 | 344 | icWBC[LIBRAW_WBI_Auto][0] = get2(); |
447 | 344 | icWBC[LIBRAW_WBI_Auto][1] = icWBC[LIBRAW_WBI_Auto][3] = 1024; |
448 | 344 | break; |
449 | 191 | case 0x3421: /* 13345, WB_BlueLevelAuto, contained in 0x0120 CameraIFD */ |
450 | 191 | icWBC[LIBRAW_WBI_Auto][2] = get2(); |
451 | 191 | break; |
452 | 9.54k | case 0x0002: /* 2, ImageWidth */ |
453 | 9.54k | tiff_ifd[ifd].t_width = getint(type); |
454 | 9.54k | break; |
455 | 8.56k | case 0x0003: /* 3, ImageHeight */ |
456 | 8.56k | tiff_ifd[ifd].t_height = getint(type); |
457 | 8.56k | break; |
458 | 4.47k | case 0x0005: /* 5, SensorLeftBorder */ |
459 | 4.47k | width = get2(); |
460 | 4.47k | imgdata.sizes.raw_inset_crops[0].cleft = width; |
461 | 4.47k | break; |
462 | 4.01k | case 0x0006: /* 6, SensorBottomBorder */ |
463 | 4.01k | height = get2(); |
464 | 4.01k | imgdata.sizes.raw_inset_crops[0].cheight = |
465 | 4.01k | height - imgdata.sizes.raw_inset_crops[0].ctop; |
466 | 4.01k | break; |
467 | 3.60k | case 0x0007: /* 7, SensorRightBorder */ |
468 | 3.60k | i = get2(); |
469 | 3.60k | width += i; |
470 | 3.60k | imgdata.sizes.raw_inset_crops[0].cwidth = |
471 | 3.60k | i - imgdata.sizes.raw_inset_crops[0].cleft; |
472 | 3.60k | break; |
473 | 4.30k | case 0x0009: /* 9, CFAPattern */ |
474 | 4.30k | if ((i = get2())) |
475 | 3.29k | filters = i; |
476 | 4.30k | break; |
477 | 2.21k | case 0x0011: /* 17, RedBalance */ |
478 | 5.19k | case 0x0012: /* 18, BlueBalance */ |
479 | 5.19k | if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) && len == 1) |
480 | 218 | cam_mul[(tag - 0x0011) * 2] = get2() / 256.f; |
481 | 5.19k | break; |
482 | 1.37k | case 0x0017: /* 23, ISO */ |
483 | 1.37k | if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) |
484 | 276 | iso_speed = get2(); |
485 | 1.37k | break; |
486 | 1.03k | case 0x0024: /* 36, WBRedLevel */ |
487 | 1.84k | case 0x0025: /* 37, WBGreenLevel */ |
488 | 2.82k | case 0x0026: /* 38, WBBlueLevel */ |
489 | 2.82k | cam_mul[tag - 0x0024] = get2(); |
490 | 2.82k | break; |
491 | 4.38k | case 0x0027: /* 39, WBInfo2 */ |
492 | 4.38k | if ((i = get2()) > 0x100) |
493 | 2.24k | break; |
494 | 217k | for (c = 0; c < i; c++) |
495 | 214k | { |
496 | 214k | if ((j = get2()) < 0x100) |
497 | 76.7k | { |
498 | 76.7k | if (j >= 0) { |
499 | 76.7k | icWBC[j][0] = get2(); |
500 | 76.7k | icWBC[j][1] = icWBC[j][3] = get2(); |
501 | 76.7k | icWBC[j][2] = get2(); |
502 | 76.7k | if (c == 1 && i > 6 && cam_mul[0] <= 0.001f) |
503 | 1.71k | for (int q = 0; q < 4; q++) |
504 | 1.37k | cam_mul[q] = float(icWBC[j][q]); |
505 | 76.7k | } |
506 | 76.7k | } |
507 | 138k | else |
508 | 138k | fseek(ifp, 6, SEEK_CUR); |
509 | 214k | } |
510 | 2.13k | break; |
511 | 1.32k | case 0x002e: /* 46, JpgFromRaw */ |
512 | 1.32k | if ((type != LIBRAW_EXIFTAG_TYPE_UNDEFINED) || (fgetc(ifp) != 0xff) || (fgetc(ifp) != 0xd8)) |
513 | 1.23k | break; |
514 | 88 | thumb_offset = ftell(ifp) - 2; |
515 | 88 | thumb_length = len; |
516 | 88 | break; |
517 | | |
518 | 1.12k | case 0x0118: /* 280, Panasonic RW2 offset */ |
519 | 1.12k | if (type != LIBRAW_EXIFTAG_TYPE_LONG) |
520 | 416 | break; |
521 | 705 | load_raw = &LibRaw::panasonic_load_raw; |
522 | 705 | load_flags = 0x2008; |
523 | 7.64k | case 0x0111: /* 273, StripOffset */ |
524 | 7.64k | if (len > 1 && len < 16384) |
525 | 4.05k | { |
526 | 4.05k | INT64 sav = ftell(ifp); |
527 | 4.05k | tiff_ifd[ifd].strip_offsets = (INT64 *)calloc(len, sizeof(INT64)); |
528 | 4.05k | tiff_ifd[ifd].strip_offsets_count = len; |
529 | 1.23M | for (int ii = 0; ii < (int)len; ii++) |
530 | 1.23M | tiff_ifd[ifd].strip_offsets[ii] = get4() + base; |
531 | 4.05k | fseek(ifp, sav, SEEK_SET); // restore position |
532 | 4.05k | } |
533 | | /* fallthrough */ |
534 | 7.64k | tiff_ifd[ifd].offset = get4() + base; |
535 | 7.64k | if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) |
536 | 5.29k | { |
537 | 5.29k | fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET); |
538 | 5.29k | if (ljpeg_start(&jh, 1)) |
539 | 192 | { |
540 | 192 | tiff_ifd[ifd].comp = 6; |
541 | 192 | tiff_ifd[ifd].t_width = jh.wide; |
542 | 192 | tiff_ifd[ifd].t_height = jh.high; |
543 | 192 | tiff_ifd[ifd].bps = jh.bits; |
544 | 192 | tiff_ifd[ifd].samples = jh.clrs; |
545 | 192 | if (!(jh.sraw || (jh.clrs & 1))) |
546 | 14 | tiff_ifd[ifd].t_width *= jh.clrs; |
547 | 192 | if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs) |
548 | 55 | { |
549 | 55 | tiff_ifd[ifd].t_width /= 2; |
550 | 55 | tiff_ifd[ifd].t_height *= 2; |
551 | 55 | } |
552 | 192 | i = order; |
553 | 192 | parse_tiff(tiff_ifd[ifd].offset + 12); |
554 | 192 | order = i; |
555 | 192 | } |
556 | 5.29k | } |
557 | 7.64k | break; |
558 | 1.84M | } |
559 | | |
560 | 1.84M | } /* processing of Panasonic-specific tags finished */ |
561 | | |
562 | 6.47M | switch (tag) |
563 | 6.47M | { /* processing of general EXIF tags */ |
564 | 52.6k | case 0xf000: /* 61440, Fuji HS10 table */ |
565 | 52.6k | fseek(ifp, get4() + base, SEEK_SET); |
566 | 52.6k | parse_tiff_ifd(base); |
567 | 52.6k | break; |
568 | 12.4k | case 0x00fe: /* NewSubfileType */ |
569 | 12.4k | tiff_ifd[ifd].newsubfiletype = int(getreal(type)); |
570 | 12.4k | break; |
571 | 142k | case 0x0100: /* 256, ImageWidth */ |
572 | 143k | case 0xf001: /* 61441, Fuji RAF RawImageFullWidth */ |
573 | 143k | tiff_ifd[ifd].t_width = getint(type); |
574 | 143k | break; |
575 | 57.6k | case 0x0101: /* 257, ImageHeight */ |
576 | 58.0k | case 0xf002: /* 61442, Fuji RAF RawImageFullHeight */ |
577 | 58.0k | tiff_ifd[ifd].t_height = getint(type); |
578 | 58.0k | break; |
579 | 45.3k | case 0x0102: /* 258, BitsPerSample */ |
580 | 50.0k | case 0xf003: /* 61443, Fuji RAF 0xf003 */ |
581 | 50.0k | if(!tiff_ifd[ifd].samples || tag != 0x0102) // ??? already set by tag 0x115 |
582 | 43.1k | tiff_ifd[ifd].samples = len & 7; |
583 | 50.0k | tiff_ifd[ifd].bps = getint(type); |
584 | 50.0k | if (tiff_bps < (unsigned)tiff_ifd[ifd].bps) |
585 | 8.94k | tiff_bps = tiff_ifd[ifd].bps; |
586 | 50.0k | break; |
587 | 1.46k | case 0xf006: /* 61446, Fuji RAF 0xf006 */ |
588 | 1.46k | raw_height = 0; |
589 | 1.46k | if (tiff_ifd[ifd].bps > 12) |
590 | 270 | break; |
591 | 1.19k | load_raw = &LibRaw::packed_load_raw; |
592 | 1.19k | load_flags = get4() ? 24 : 80; |
593 | 1.19k | break; |
594 | 27.4k | case 0x0103: /* 259, Compression */ |
595 | | /* |
596 | | 262 = Kodak 262 |
597 | | 32767 = Sony ARW Compressed |
598 | | 32769 = Packed RAW |
599 | | 32770 = Samsung SRW Compressed |
600 | | 32772 = Samsung SRW Compressed 2 |
601 | | 32867 = Kodak KDC Compressed |
602 | | 34713 = Nikon NEF Compressed |
603 | | 65000 = Kodak DCR Compressed |
604 | | 65535 = Pentax PEF Compressed |
605 | | */ |
606 | 27.4k | tiff_ifd[ifd].comp = getint(type); |
607 | 27.4k | break; |
608 | 13.4k | case 0x0106: /* 262, PhotometricInterpretation */ |
609 | 13.4k | tiff_ifd[ifd].phint = get2(); |
610 | 13.4k | break; |
611 | 6.31k | case 0x010e: /* 270, ImageDescription */ |
612 | 6.31k | fread(desc, 512, 1, ifp); |
613 | 6.31k | break; |
614 | 181k | case 0x010f: /* 271, Make */ |
615 | 181k | fgets(make, 64, ifp); |
616 | 181k | break; |
617 | 34.8k | case 0x0110: /* 272, Model */ |
618 | 34.8k | if (!strncmp(make, "Hasselblad", 10) && model[0] && |
619 | 944 | (imHassy.format != LIBRAW_HF_Imacon)) |
620 | 895 | break; |
621 | 33.9k | fgets(model, 64, ifp); |
622 | 33.9k | break; |
623 | 7.05k | case 0x0116: // 278 |
624 | 7.05k | tiff_ifd[ifd].rows_per_strip = getint(type); |
625 | 7.05k | break; |
626 | 17.4k | case 0x0112: /* 274, Orientation */ |
627 | 17.4k | tiff_ifd[ifd].t_flip = "50132467"[get2() & 7] - '0'; |
628 | 17.4k | break; |
629 | 8.54k | case 0x0115: /* 277, SamplesPerPixel */ |
630 | 8.54k | tiff_ifd[ifd].samples = getint(type) & 7; |
631 | 8.54k | break; |
632 | 3.64k | case 0x0152: /* Extrasamples */ |
633 | 3.64k | tiff_ifd[ifd].extrasamples = (getint(type) & 0xff) + 1024; |
634 | 3.64k | break; |
635 | 18.5k | case 0x0117: /* 279, StripByteCounts */ |
636 | 18.5k | if (len > 1 && len < 16384) |
637 | 3.43k | { |
638 | 3.43k | INT64 sav = ftell(ifp); |
639 | 3.43k | tiff_ifd[ifd].strip_byte_counts = (INT64 *)calloc(len, sizeof(INT64)); |
640 | 3.43k | tiff_ifd[ifd].strip_byte_counts_count = len; |
641 | 1.33M | for (int ii = 0; ii < (int)len; ii++) |
642 | 1.32M | tiff_ifd[ifd].strip_byte_counts[ii] = get4(); |
643 | 3.43k | fseek(ifp, sav, SEEK_SET); // restore position |
644 | 3.43k | } |
645 | | /* fallback */ |
646 | 23.6k | case 0x0202: // 514 |
647 | 24.4k | case 0xf008: // 61448 |
648 | 24.4k | tiff_ifd[ifd].bytes = get4(); |
649 | 24.4k | break; |
650 | 428 | case 0xf00e: // 61454, FujiFilm "As Shot" |
651 | 1.28k | FORC3 cam_mul[GRBG_2_RGBG(c)] = float(getint(type)); |
652 | 428 | break; |
653 | 12.5k | case 0x0131: /* 305, Software */ |
654 | 12.5k | fgets(software, 64, ifp); |
655 | 12.5k | if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) || |
656 | 11.8k | !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) || |
657 | 11.2k | !strcmp(software, "Digital Photo Professional")) |
658 | 1.56k | is_raw = 0; |
659 | 12.5k | break; |
660 | 13.0k | case 0x0132: /* 306, DateTime */ |
661 | 13.0k | get_timestamp(0); |
662 | 13.0k | break; |
663 | 1.26k | case 0x013b: /* 315, Artist */ |
664 | 1.26k | fread(artist, 64, 1, ifp); |
665 | 1.26k | break; |
666 | 853 | case 0x013d: // 317 |
667 | 853 | tiff_ifd[ifd].predictor = getint(type); |
668 | 853 | break; |
669 | 1.30k | case 0x0142: /* 322, TileWidth */ |
670 | 1.30k | tiff_ifd[ifd].t_tile_width = getint(type); |
671 | 1.30k | break; |
672 | 2.27k | case 0x0143: /* 323, TileLength */ |
673 | 2.27k | tiff_ifd[ifd].t_tile_length = getint(type); |
674 | 2.27k | break; |
675 | 4.79k | case 0x0144: /* 324, TileOffsets */ |
676 | 4.79k | tiff_ifd[ifd].offset = len > 1 ? ftell(ifp) : get4(); // FIXME: get8 for BigTIFF |
677 | 4.79k | if (len == 1) |
678 | 1.62k | tiff_ifd[ifd].t_tile_width = tiff_ifd[ifd].t_tile_length = 0; |
679 | 4.79k | if (len == 4) |
680 | 1.39k | { |
681 | 1.39k | load_raw = &LibRaw::sinar_4shot_load_raw; |
682 | 1.39k | is_raw = 5; |
683 | 1.39k | } |
684 | 4.79k | break; |
685 | 1.23k | case 0x0145: // 325 |
686 | 1.23k | tiff_ifd[ifd].bytes = len > 1 ? ftell(ifp) : get4(); // FIXME: get8 for BigTIFF |
687 | 1.23k | break; |
688 | 56.1k | case 0x014a: /* 330, SubIFDs */ |
689 | 56.1k | if (!strcmp(model, "DSLR-A100") && tiff_ifd[ifd].t_width == 3872) |
690 | 0 | { |
691 | 0 | load_raw = &LibRaw::sony_arw_load_raw; |
692 | 0 | data_offset = get4() + base; |
693 | 0 | ifd++; |
694 | 0 | if (ifd >= int(sizeof tiff_ifd / sizeof tiff_ifd[0])) |
695 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
696 | 0 | break; |
697 | 0 | } |
698 | 56.1k | if (!strncmp(make, "Hasselblad", 10) && |
699 | 2.27k | libraw_internal_data.unpacker_data.hasselblad_parser_flag) |
700 | 608 | { |
701 | 608 | fseek(ifp, ftell(ifp) + 4, SEEK_SET); |
702 | 608 | fseek(ifp, get4() + base, SEEK_SET); |
703 | 608 | parse_tiff_ifd(base); |
704 | 608 | break; |
705 | 608 | } |
706 | 55.5k | if (len > 1000) |
707 | 2.52k | len = 1000; /* 1000 SubIFDs is enough */ |
708 | 96.1k | while (len--) |
709 | 73.1k | { |
710 | 73.1k | INT64 ii = ftell(ifp); |
711 | 73.1k | fseek(ifp, get4() + base, SEEK_SET); |
712 | 73.1k | if (parse_tiff_ifd(base)) |
713 | 32.5k | break; |
714 | 40.6k | fseek(ifp, ii + 4LL, SEEK_SET); |
715 | 40.6k | } |
716 | 55.5k | break; |
717 | 2.71k | case 0x0153: // 339 |
718 | 2.71k | tiff_ifd[ifd].sample_format = getint(type); |
719 | 2.71k | break; |
720 | 623 | case 0x0190: // 400 |
721 | 623 | strcpy(make, "Sarnoff"); |
722 | 623 | maximum = 0xfff; |
723 | 623 | break; |
724 | 1.46k | case 0x02bc: // 700 |
725 | 1.46k | if ((tagtypeIs(LIBRAW_EXIFTAG_TYPE_BYTE) || |
726 | 1.10k | tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII) || |
727 | 931 | tagtypeIs(LIBRAW_EXIFTAG_TYPE_SBYTE) || |
728 | 698 | tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_binary)) && |
729 | 969 | (len > 1) && (len < 5100000)) |
730 | 542 | { |
731 | 542 | xmpdata = (char *)calloc(xmplen = len + 1,1); |
732 | 542 | unsigned br = fread(xmpdata,1, len, ifp); |
733 | 542 | xmpdata[br] = 0; |
734 | 542 | } |
735 | 1.46k | break; |
736 | 868 | case 0x7000: |
737 | 868 | imSony.SonyRawFileType = get2(); |
738 | 868 | break; |
739 | 2.11k | case 0x7010: // 28688 |
740 | 8.46k | FORC4 sony_curve[c + 1] = get2() >> 2 & 0xfff; |
741 | 12.7k | for (i = 0; i < 5; i++) |
742 | 10.5M | for (j = sony_curve[i] + 1; j <= (int)sony_curve[i + 1]; j++) |
743 | 10.5M | curve[j] = curve[j - 1] + (1 << i); |
744 | 2.11k | break; |
745 | 1.09k | case 0x7200: // 29184, Sony SR2Private |
746 | 1.09k | sony_offset = get4(); |
747 | 1.09k | break; |
748 | 998 | case 0x7201: // 29185, Sony SR2Private |
749 | 998 | sony_length = get4(); |
750 | 998 | break; |
751 | 244 | case 0x7221: // 29217, Sony SR2Private |
752 | 244 | sony_key = get4(); |
753 | 244 | break; |
754 | 1.00k | case 0x7250: // 29264, Sony SR2Private |
755 | 1.00k | parse_minolta(ftell(ifp)); |
756 | 1.00k | raw_width = 0; |
757 | 1.00k | break; |
758 | 282 | case 0x7303: // 29443, Sony SR2SubIFD |
759 | 1.12k | FORC4 cam_mul[GRBG_2_RGBG(c)] = get2(); |
760 | 282 | break; |
761 | 434 | case 0x7313: // 29459, Sony SR2SubIFD |
762 | 1.73k | FORC4 cam_mul[RGGB_2_RGBG(c)] = get2(); |
763 | 434 | break; |
764 | 928 | case 0x7310: // 29456, Sony SR2SubIFD |
765 | 3.71k | FORC4 cblack[RGGB_2_RGBG(c)] = get2(); |
766 | 928 | i = cblack[3]; |
767 | 2.78k | FORC3 if (i > (int)cblack[c]) i = cblack[c]; |
768 | 3.71k | FORC4 cblack[c] -= i; |
769 | 928 | black = i; |
770 | 928 | break; |
771 | 557 | case 0x827d: /* 33405, Model2 */ |
772 | | /* |
773 | | for Kodak ProBack 645 PB645x-yyyy 'x' is: |
774 | | 'M' for Mamiya 645 |
775 | | 'C' for Contax 645 |
776 | | 'H' for Hasselblad H-series |
777 | | */ |
778 | 557 | fgets(model2, 64, ifp); |
779 | 557 | break; |
780 | 3.42k | case 0x828d: /* 33421, CFARepeatPatternDim */ |
781 | 3.42k | if (get2() == 6 && get2() == 6) |
782 | 1.59k | tiff_ifd[ifd].t_filters = filters = 9; |
783 | 3.42k | break; |
784 | 6.13k | case 0x828e: /* 33422, CFAPattern */ |
785 | 6.13k | if (filters == 9) |
786 | 2.48k | { |
787 | 89.3k | FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3; |
788 | 2.48k | break; |
789 | 2.48k | } |
790 | 5.20k | case 0xfd09: /* 64777, Kodak P-series */ |
791 | 5.20k | if (len == 36) |
792 | 1.09k | { |
793 | 1.09k | tiff_ifd[ifd].t_filters = filters = 9; |
794 | 1.09k | colors = 3; |
795 | 39.3k | FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3; |
796 | 1.09k | } |
797 | 4.11k | else if (len > 0) |
798 | 3.74k | { |
799 | 3.74k | if ((plen = len) > 16) |
800 | 2.28k | plen = 16; |
801 | 3.74k | fread(cfa_pat, 1, plen, ifp); |
802 | 39.7k | for (colors = cfa = i = 0; i < (int)plen && colors < 4; i++) |
803 | 35.9k | { |
804 | 35.9k | if (cfa_pat[i] > 31) |
805 | 15.6k | continue; // Skip wrong data |
806 | 20.3k | colors += !(cfa & (1 << cfa_pat[i])); |
807 | 20.3k | cfa |= 1 << cfa_pat[i]; |
808 | 20.3k | } |
809 | 3.74k | if (cfa == 070) |
810 | 275 | memcpy(cfa_pc, "\003\004\005", 3); /* CMY */ |
811 | 3.74k | if (cfa == 072) |
812 | 454 | memcpy(cfa_pc, "\005\003\004\001", 4); /* GMCY */ |
813 | 3.74k | goto guess_cfa_pc; |
814 | 3.74k | } |
815 | 1.46k | break; |
816 | 5.81k | case 0x8290: // 33424 |
817 | 29.3k | case 0xfe00: // 65024 |
818 | 29.3k | fseek(ifp, get4() + base, SEEK_SET); |
819 | 29.3k | parse_kodak_ifd(base); |
820 | 29.3k | break; |
821 | 1.68k | case 0x829a: /* 33434, ExposureTime */ |
822 | 1.68k | tiff_ifd[ifd].t_shutter = shutter = getrealf(type); |
823 | 1.68k | break; |
824 | 1.31k | case 0x829d: /* 33437, FNumber */ |
825 | 1.31k | aperture = getrealf(type); |
826 | 1.31k | break; |
827 | 4.12k | case 0x9400: |
828 | 4.12k | imCommon.exifAmbientTemperature = getrealf(type); |
829 | 4.12k | if ((imCommon.CameraTemperature > -273.15f) && |
830 | 1.49k | ((OlyID == OlyID_TG_5) || |
831 | 1.45k | (OlyID == OlyID_TG_6) || |
832 | 1.37k | (OlyID == OlyID_TG_7))) |
833 | 165 | imCommon.CameraTemperature += |
834 | 165 | imCommon.exifAmbientTemperature; |
835 | 4.12k | break; |
836 | 851 | case 0x9401: |
837 | 851 | imCommon.exifHumidity = getrealf(type); |
838 | 851 | break; |
839 | 2.07k | case 0x9402: |
840 | 2.07k | imCommon.exifPressure = getrealf(type); |
841 | 2.07k | break; |
842 | 829 | case 0x9403: |
843 | 829 | imCommon.exifWaterDepth = getrealf(type); |
844 | 829 | break; |
845 | 781 | case 0x9404: |
846 | 781 | imCommon.exifAcceleration = getrealf(type); |
847 | 781 | break; |
848 | 2.39k | case 0x9405: |
849 | 2.39k | imCommon.exifCameraElevationAngle = getrealf(type); |
850 | 2.39k | break; |
851 | 406 | case 0xa405: // FocalLengthIn35mmFormat |
852 | 406 | imgdata.lens.FocalLengthIn35mmFormat = get2(); |
853 | 406 | break; |
854 | 269 | case 0xa431: // BodySerialNumber |
855 | 1.20k | case 0xc62f: |
856 | 1.20k | stmread(imgdata.shootinginfo.BodySerial, len, ifp); |
857 | 1.20k | break; |
858 | 669 | case 0xa432: // LensInfo, 42034dec, Lens Specification per EXIF standard |
859 | 669 | imgdata.lens.MinFocal = getrealf(type); |
860 | 669 | imgdata.lens.MaxFocal = getrealf(type); |
861 | 669 | imgdata.lens.MaxAp4MinFocal = getrealf(type); |
862 | 669 | imgdata.lens.MaxAp4MaxFocal = getrealf(type); |
863 | 669 | break; |
864 | 748 | case 0xa435: // LensSerialNumber |
865 | 748 | stmread(imgdata.lens.LensSerial, len, ifp); |
866 | 748 | break; |
867 | 2.54k | case 0xc630: // DNG LensInfo, Lens Specification per EXIF standard |
868 | 2.54k | imgdata.lens.MinFocal = getrealf(type); |
869 | 2.54k | imgdata.lens.MaxFocal = getrealf(type); |
870 | 2.54k | imgdata.lens.MaxAp4MinFocal = getrealf(type); |
871 | 2.54k | imgdata.lens.MaxAp4MaxFocal = getrealf(type); |
872 | 2.54k | break; |
873 | 464 | case 0xa420: /* 42016, ImageUniqueID */ |
874 | 464 | stmread(imgdata.color.ImageUniqueID, len, ifp); |
875 | 464 | break; |
876 | 274 | case 0xc65d: /* 50781, RawDataUniqueID */ |
877 | 274 | imgdata.color.RawDataUniqueID[16] = 0; |
878 | 274 | fread(imgdata.color.RawDataUniqueID, 1, 16, ifp); |
879 | 274 | break; |
880 | 368 | case 0xa433: // LensMake |
881 | 368 | stmread(imgdata.lens.LensMake, len, ifp); |
882 | 368 | break; |
883 | 1.04k | case 0xa434: // LensModel |
884 | 1.04k | stmread(imgdata.lens.Lens, len, ifp); |
885 | 1.04k | if (!strncmp(imgdata.lens.Lens, "----", 4)) |
886 | 220 | imgdata.lens.Lens[0] = 0; |
887 | 1.04k | break; |
888 | 1.83k | case 0x9205: |
889 | 1.83k | imgdata.lens.EXIF_MaxAp = libraw_powf64l(2.0f, (getrealf(type) / 2.0f)); |
890 | 1.83k | break; |
891 | 777 | case 0x8602: /* 34306, Leaf white balance */ |
892 | 777 | FORC4 |
893 | 3.10k | { |
894 | 3.10k | int q = get2(); |
895 | 3.10k | if (q) |
896 | 2.04k | cam_mul[GRGB_2_RGBG(c)] = 4096.f / q; |
897 | 3.10k | } |
898 | 777 | break; |
899 | 1.07k | case 0x8603: /* 34307, Leaf CatchLight color matrix */ |
900 | 1.07k | fread(software, 1, 7, ifp); |
901 | 1.07k | if (strncmp(software, "MATRIX", 6)) |
902 | 709 | break; |
903 | 367 | colors = 4; |
904 | 1.46k | for (raw_color = i = 0; i < 3; i++) |
905 | 1.10k | { |
906 | 4.40k | FORC4 fscanf(ifp, "%f", &rgb_cam[i][GRGB_2_RGBG(c)]); |
907 | 1.10k | if (!use_camera_wb) |
908 | 1.10k | continue; |
909 | 0 | num = 0; |
910 | 0 | FORC4 num += rgb_cam[i][c]; |
911 | 0 | FORC4 rgb_cam[i][c] /= float(MAX(1, num)); |
912 | 0 | } |
913 | 367 | break; |
914 | 3.80k | case 0x8606: /* 34310, Leaf metadata */ |
915 | 3.80k | parse_mos(ftell(ifp)); |
916 | 5.15k | case 0x85ff: // 34303 |
917 | 5.15k | strcpy(make, "Leaf"); |
918 | 5.15k | break; |
919 | 157k | case 0x8769: /* 34665, EXIF tag */ |
920 | 157k | fseek(ifp, get4() + base, SEEK_SET); |
921 | 157k | parse_exif(base); |
922 | 157k | break; |
923 | 2.68k | case 0x8825: /* 34853, GPSInfo tag */ |
924 | 2.68k | { |
925 | 2.68k | INT64 pos; |
926 | 2.68k | fseek(ifp, pos = (get4() + base), SEEK_SET); |
927 | 2.68k | parse_gps(base); |
928 | 2.68k | fseek(ifp, pos, SEEK_SET); |
929 | 2.68k | parse_gps_libraw(base); |
930 | 2.68k | } |
931 | 2.68k | break; |
932 | 256 | case 0x8773: /* 34675, InterColorProfile */ |
933 | 665 | case 0xc68f: /* 50831, AsShotICCProfile */ |
934 | 665 | profile_offset = ftell(ifp); |
935 | 665 | profile_length = len; |
936 | 665 | break; |
937 | 374 | case 0x9102: /* 37122, CompressedBitsPerPixel */ |
938 | 374 | kodak_cbpp = get4(); |
939 | 374 | break; |
940 | 2.66k | case 0x920a: /* 37386, FocalLength */ |
941 | 2.66k | focal_len = getrealf(type); |
942 | 2.66k | break; |
943 | 195 | case 0x9211: /* 37393, ImageNumber */ |
944 | 195 | shot_order = getint(type); |
945 | 195 | break; |
946 | 974 | case 0x9215: /* 37397, ExposureIndex */ |
947 | 974 | imCommon.exifExposureIndex = getrealf(type); |
948 | 974 | break; |
949 | 1.07k | case 0x9218: /* 37400, old Kodak KDC tag */ |
950 | 4.31k | for (raw_color = i = 0; i < 3; i++) |
951 | 3.23k | { |
952 | 3.23k | getreal(type); |
953 | 9.70k | FORC3 rgb_cam[i][c] = getrealf(type); |
954 | 3.23k | } |
955 | 1.07k | break; |
956 | 879 | case 0xa010: // 40976 |
957 | 879 | strip_offset = get4(); |
958 | 879 | switch (tiff_ifd[ifd].comp) |
959 | 879 | { |
960 | 209 | case 0x8002: // 32770 |
961 | 209 | load_raw = &LibRaw::samsung_load_raw; |
962 | 209 | break; |
963 | 176 | case 0x8004: // 32772 |
964 | 176 | load_raw = &LibRaw::samsung2_load_raw; |
965 | 176 | break; |
966 | 164 | case 0x8005: // 32773 |
967 | 164 | load_raw = &LibRaw::samsung3_load_raw; |
968 | 164 | break; |
969 | 879 | } |
970 | 879 | break; |
971 | 879 | case 0xb4c3: /* 46275, Imacon tags */ |
972 | 495 | imHassy.format = LIBRAW_HF_Imacon; |
973 | 495 | strcpy(make, "Imacon"); |
974 | 495 | data_offset = ftell(ifp); |
975 | 495 | ima_len = len; |
976 | 495 | break; |
977 | 422 | case 0xb4c7: // 46279 |
978 | 422 | if (!ima_len) |
979 | 264 | break; |
980 | 158 | fseek(ifp, 38, SEEK_CUR); |
981 | 3.21k | case 0xb4c2: // 46274 |
982 | 3.21k | fseek(ifp, 40, SEEK_CUR); |
983 | 3.21k | raw_width = get4(); |
984 | 3.21k | raw_height = get4(); |
985 | 3.21k | left_margin = get4() & 7; |
986 | 3.21k | width = raw_width - left_margin - (get4() & 7); |
987 | 3.21k | top_margin = get4() & 7; |
988 | 3.21k | height = raw_height - top_margin - (get4() & 7); |
989 | 3.21k | if (raw_width == 7262 && ima_len == 234317952) |
990 | 0 | { |
991 | 0 | height = 5412; |
992 | 0 | width = 7216; |
993 | 0 | left_margin = 7; |
994 | 0 | filters = 0; |
995 | 0 | } |
996 | 3.21k | else if (raw_width == 7262) |
997 | 63 | { |
998 | 63 | height = 5444; |
999 | 63 | width = 7244; |
1000 | 63 | left_margin = 7; |
1001 | 63 | } |
1002 | 3.21k | fseek(ifp, 52, SEEK_CUR); |
1003 | 9.63k | FORC3 cam_mul[c] = getrealf(LIBRAW_EXIFTAG_TYPE_FLOAT); |
1004 | 3.21k | fseek(ifp, 114, SEEK_CUR); |
1005 | 3.21k | flip = (get2() >> 7) * 90; |
1006 | 3.21k | if (width * (height * 6l) == ima_len) |
1007 | 781 | { |
1008 | 781 | if (flip % 180 == 90) |
1009 | 321 | SWAP(width, height); |
1010 | 781 | raw_width = width; |
1011 | 781 | raw_height = height; |
1012 | 781 | left_margin = top_margin = filters = flip = 0; |
1013 | 781 | } |
1014 | 3.21k | c = unsigned(height) * unsigned(width) / 1000000; |
1015 | 3.21k | if (c == 32) |
1016 | 206 | c--; |
1017 | 3.21k | sprintf(model, "Ixpress %d-Mp", c); |
1018 | 3.21k | load_raw = &LibRaw::imacon_full_load_raw; |
1019 | 3.21k | if (filters) |
1020 | 1.82k | { |
1021 | 1.82k | if (left_margin & 1) |
1022 | 822 | filters = 0x61616161; |
1023 | 1.82k | load_raw = &LibRaw::unpacked_load_raw; |
1024 | 1.82k | } |
1025 | 3.21k | maximum = 0xffff; |
1026 | 3.21k | break; |
1027 | 575 | case 0xc516: /* 50454, Sinar tag */ |
1028 | 880 | case 0xc517: // 50455 |
1029 | 880 | if (len < 1 || len > 2560000 || !(cbuf = (char *)malloc(len))) |
1030 | 344 | break; |
1031 | 536 | if (fread(cbuf, 1, len, ifp) != (int)len) |
1032 | 3 | throw LIBRAW_EXCEPTION_IO_CORRUPT; // cbuf to be free'ed in recycle |
1033 | 533 | cbuf[len - 1] = 0; |
1034 | 1.69k | for (cp = cbuf - 1; cp && cp < cbuf + len; cp = strchr(cp, '\n')) |
1035 | 1.16k | if (!strncmp(++cp, "Neutral ", 8)) |
1036 | 14 | sscanf(cp + 8, "%f %f %f", cam_mul, cam_mul + 1, cam_mul + 2); |
1037 | 533 | free(cbuf); |
1038 | 533 | break; |
1039 | 2.60k | case 0xc51a: // 50458 |
1040 | 2.60k | if (!make[0]) |
1041 | 654 | strcpy(make, "Hasselblad"); |
1042 | 2.60k | break; |
1043 | 67.5k | case 0xc51b: /* 50459, Hasselblad tag */ |
1044 | 67.5k | if (!libraw_internal_data.unpacker_data.hasselblad_parser_flag) |
1045 | 5.52k | { |
1046 | 5.52k | libraw_internal_data.unpacker_data.hasselblad_parser_flag = 1; |
1047 | 5.52k | i = order; |
1048 | 5.52k | INT64 jj = ftell(ifp); |
1049 | 5.52k | c = tiff_nifds; |
1050 | 5.52k | order = get2(); |
1051 | 5.52k | get2(); |
1052 | 5.52k | fseek(ifp, jj + get4(), SEEK_SET); |
1053 | 5.52k | parse_tiff_ifd(jj); |
1054 | 5.52k | maximum = 0xffff; |
1055 | 5.52k | tiff_nifds = c; |
1056 | 5.52k | order = i; |
1057 | 5.52k | break; |
1058 | 5.52k | } |
1059 | 65.3k | case 0xc612: /* 50706, DNGVersion */ |
1060 | 261k | FORC4 dng_version = (dng_version << 8) + fgetc(ifp); |
1061 | 65.3k | if (!make[0]) |
1062 | 4.01k | strcpy(make, "DNG"); |
1063 | 65.3k | is_raw = 1; |
1064 | 65.3k | break; |
1065 | 1.41k | case 0xc614: /* 50708, UniqueCameraModel */ |
1066 | 1.41k | stmread(imgdata.color.UniqueCameraModel, len, ifp); |
1067 | 1.41k | if (model[0]) |
1068 | 477 | break; |
1069 | 933 | strncpy(make, imgdata.color.UniqueCameraModel, |
1070 | 933 | MIN(len, sizeof(imgdata.color.UniqueCameraModel))); |
1071 | 933 | if ((cp = strchr(make, ' '))) |
1072 | 126 | { |
1073 | 126 | strcpy(model, cp + 1); |
1074 | 126 | *cp = 0; |
1075 | 126 | } |
1076 | 933 | break; |
1077 | 2.27k | case 0xc616: /* 50710, CFAPlaneColor */ |
1078 | 2.27k | if (filters == 9) |
1079 | 185 | break; |
1080 | 2.08k | if (len > 4) |
1081 | 1.14k | len = 4; |
1082 | 2.08k | colors = len; |
1083 | 2.08k | fread(cfa_pc, 1, colors, ifp); |
1084 | 5.82k | guess_cfa_pc: |
1085 | 14.9k | FORCC tab[cfa_pc[c]] = c; |
1086 | 5.82k | cdesc[c] = 0; |
1087 | 99.0k | for (i = 16; i--;) |
1088 | 93.2k | filters = filters << 2 | tab[cfa_pat[i % plen]]; |
1089 | 5.82k | filters -= !filters; |
1090 | 5.82k | tiff_ifd[ifd].t_filters = filters; |
1091 | 5.82k | break; |
1092 | 761 | case 0xc617: /* 50711, CFALayout */ |
1093 | 761 | if (get2() == 2) |
1094 | 257 | tiff_ifd[ifd].t_fuji_width = fuji_width = 1; |
1095 | 761 | break; |
1096 | 2.77k | case 0x0123: // 291 |
1097 | 3.39k | case 0xc618: /* 50712, LinearizationTable */ |
1098 | 3.39k | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINTABLE; |
1099 | 3.39k | tiff_ifd[ifd].lineartable_offset = ftell(ifp); |
1100 | 3.39k | tiff_ifd[ifd].lineartable_len = len; |
1101 | 3.39k | linear_table(len); |
1102 | 3.39k | break; |
1103 | 2.00k | case 0xc619: /* 50713, BlackLevelRepeatDim */ |
1104 | 2.00k | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1105 | | |
1106 | 2.00k | tiff_ifd[ifd].dng_levels.dng_cblack[4] = cblack[4] = get2(); |
1107 | 2.00k | tiff_ifd[ifd].dng_levels.dng_fcblack[4] = float(cblack[4]); |
1108 | | |
1109 | | |
1110 | 2.00k | tiff_ifd[ifd].dng_levels.dng_cblack[5] = cblack[5] = get2(); |
1111 | 2.00k | tiff_ifd[ifd].dng_levels.dng_fcblack[5] = float(cblack[5]); |
1112 | | |
1113 | 2.00k | if (cblack[4] * cblack[5] > |
1114 | 2.00k | (LIBRAW_CBLACK_SIZE - |
1115 | 2.00k | 7)) // Use last cblack item as DNG black level count |
1116 | 904 | { |
1117 | 904 | tiff_ifd[ifd].dng_levels.dng_fcblack[4] = |
1118 | 904 | tiff_ifd[ifd].dng_levels.dng_fcblack[5] = 1.f; |
1119 | 904 | tiff_ifd[ifd].dng_levels.dng_cblack[4] = tiff_ifd[ifd].dng_levels.dng_cblack[5] = |
1120 | 904 | cblack[4] = cblack[5] = 1; |
1121 | 904 | } |
1122 | 2.00k | break; |
1123 | | |
1124 | 2.98k | case 0xf00c: |
1125 | 2.98k | if (imFuji.RAFDataGeneration != 4096) |
1126 | 2.78k | { |
1127 | 2.78k | unsigned fwb[4]; |
1128 | 11.1k | FORC4 fwb[c] = get4(); |
1129 | 2.78k | if (fwb[3] < 0x100) |
1130 | 1.77k | { |
1131 | 5.33k | FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c]; |
1132 | 1.77k | icWBC[fwb[3]][3] = icWBC[fwb[3]][1]; |
1133 | 1.77k | if ((fwb[3] == 17) && // Tungsten WB |
1134 | 1.37k | (libraw_internal_data.unpacker_data.lenRAFData > 3) && |
1135 | 831 | (libraw_internal_data.unpacker_data.lenRAFData < 10240000)) |
1136 | 831 | { |
1137 | 831 | INT64 f_save = ftell(ifp); |
1138 | 831 | rafdata = (ushort *)calloc( |
1139 | 831 | sizeof(ushort) * libraw_internal_data.unpacker_data.lenRAFData,1); |
1140 | 831 | fseek(ifp, libraw_internal_data.unpacker_data.posRAFData, SEEK_SET); |
1141 | 831 | fread(rafdata, sizeof(ushort), |
1142 | 831 | libraw_internal_data.unpacker_data.lenRAFData, ifp); |
1143 | 831 | fseek(ifp, f_save, SEEK_SET); |
1144 | | |
1145 | 831 | uchar *PrivateMknBuf = (uchar *)rafdata; |
1146 | 831 | int PrivateMknLength = libraw_internal_data.unpacker_data.lenRAFData |
1147 | 831 | << 1; |
1148 | 19.8M | for (int pos = 0; pos < PrivateMknLength - 16; pos++) |
1149 | 19.8M | { |
1150 | 19.8M | if (!memcmp(PrivateMknBuf + pos, "TSNERDTS", 8)) // STDRENST |
1151 | 261 | { |
1152 | 261 | imFuji.isTSNERDTS = 1; |
1153 | 261 | break; |
1154 | 261 | } |
1155 | 19.8M | } |
1156 | 831 | int fj; // 31? (fj<<1)-0x3c : 34? (fj<<1)-0x4e : undef |
1157 | 831 | int is34 = 0; |
1158 | 831 | if ((imFuji.RAFDataVersion == 0x0260) || // X-Pro3, GFX 100S |
1159 | 817 | (imFuji.RAFDataVersion == 0x0261) || // X100V, GFX 50S II |
1160 | 817 | (imFuji.RAFDataVersion == 0x0262) || // X-T4 |
1161 | 813 | (imFuji.RAFDataVersion == 0x0263) || // X-H2S |
1162 | 813 | (imFuji.RAFDataVersion == 0x0264) || // X-S10, X-H2 |
1163 | 813 | (imFuji.RAFDataVersion == 0x0265) || // X-E4, X-T5 |
1164 | 813 | (imFuji.RAFDataVersion == 0x0266) || // X-T30 II, X-S20 |
1165 | 813 | (imFuji.RAFDataVersion == 0x0267) || // GFX 100 II |
1166 | 809 | (imFuji.RAFDataVersion == 0x0368) || // GFX 100S II |
1167 | 809 | (imFuji.RAFDataVersion == 0x0369) || // X100VI |
1168 | 809 | (imFuji.RAFDataVersion == 0x036a) || // X-T50 |
1169 | 809 | (imFuji.RAFDataVersion == 0x036b) || // X-M5 |
1170 | 809 | !strcmp(model, "X-Pro3") || |
1171 | 808 | !strcmp(model, "GFX100S II") || !strcmp(model, "GFX 100S II") || |
1172 | 808 | !strcmp(model, "GFX100S") || !strcmp(model, "GFX 100S") || |
1173 | 807 | !strcmp(model, "GFX100 II") || !strcmp(model, "GFX 100 II") || |
1174 | 805 | !strcmp(model, "GFX50S II") || !strcmp(model, "GFX 50S II") || |
1175 | 805 | !strcmp(model, "X100VI") || |
1176 | 788 | !strcmp(model, "X100V") || |
1177 | 751 | !strcmp(model, "X-T4") || |
1178 | 635 | !strcmp(model, "X-H2S") || |
1179 | 550 | !strcmp(model, "X-H2") || |
1180 | 515 | !strcmp(model, "X-E4") || |
1181 | 424 | !strcmp(model, "X-T50") || |
1182 | 424 | !strcmp(model, "X-T5") || |
1183 | 358 | !strcmp(model, "X-M5") || |
1184 | 358 | !strcmp(model, "X-T30 II") || |
1185 | 356 | !strcmp(model, "X-S10") || |
1186 | 265 | !strcmp(model, "X-S20")) |
1187 | | // is34 cameras have 34 CCT values instead of 31, manual still claims 2500 to 10000 K |
1188 | | // aligned 3000 K to Incandescent, as it is usual w/ other Fujifilm cameras |
1189 | 595 | is34 = 1; |
1190 | | |
1191 | 831 | for (int fi = 0; |
1192 | 4.75M | fi < int(libraw_internal_data.unpacker_data.lenRAFData - 3); fi++) // looking for Tungsten WB |
1193 | 4.75M | { |
1194 | 4.75M | if ((fwb[0] == rafdata[fi]) && (fwb[1] == rafdata[fi + 1]) && |
1195 | 476k | (fwb[2] == rafdata[fi + 2])) // found Tungsten WB |
1196 | 2.01k | { |
1197 | 2.01k | if (fi > 14 && rafdata[fi - 15] != |
1198 | 1.91k | fwb[0]) // 15 is offset of Tungsten WB from the first |
1199 | | // preset, Fine Weather WB |
1200 | 1.42k | continue; |
1201 | 594 | if (fi >= 15) |
1202 | 489 | { |
1203 | 3.42k | for (int wb_ind = 0, ofst = fi - 15; wb_ind < (int)Fuji_wb_list1.size(); |
1204 | 2.93k | wb_ind++, ofst += 3) |
1205 | 2.93k | { |
1206 | 2.93k | icWBC[Fuji_wb_list1[wb_ind]][1] = |
1207 | 2.93k | icWBC[Fuji_wb_list1[wb_ind]][3] = rafdata[ofst]; |
1208 | 2.93k | icWBC[Fuji_wb_list1[wb_ind]][0] = rafdata[ofst + 1]; |
1209 | 2.93k | icWBC[Fuji_wb_list1[wb_ind]][2] = rafdata[ofst + 2]; |
1210 | 2.93k | } |
1211 | 489 | } |
1212 | | |
1213 | 594 | if (is34) |
1214 | 389 | fi += 24; |
1215 | 594 | fi += 96; |
1216 | 1.96k | for (fj = fi; fj < (fi + 15); fj += 3) // looking for the end of the WB table |
1217 | 1.84k | { |
1218 | 1.84k | if (fj > libraw_internal_data.unpacker_data.lenRAFData - 3) |
1219 | 21 | break; |
1220 | 1.81k | if (rafdata[fj] != rafdata[fi]) |
1221 | 448 | { |
1222 | 448 | fj -= 93; |
1223 | 448 | if (is34) |
1224 | 264 | fj -= 9; |
1225 | | //printf ("wb start in DNG: 0x%04x\n", fj*2-0x4e); |
1226 | 14.3k | for (int iCCT = 0, ofst = fj; iCCT < 31 |
1227 | 13.8k | && ofst < libraw_internal_data.unpacker_data.lenRAFData - 3; |
1228 | 13.8k | iCCT++, ofst += 3) |
1229 | 13.8k | { |
1230 | 13.8k | icWBCCTC[iCCT][0] = float(FujiCCT_K[iCCT]); |
1231 | 13.8k | icWBCCTC[iCCT][1] = rafdata[ofst + 1]; |
1232 | 13.8k | icWBCCTC[iCCT][2] = icWBCCTC[iCCT][4] = rafdata[ofst]; |
1233 | 13.8k | icWBCCTC[iCCT][3] = rafdata[ofst + 2]; |
1234 | 13.8k | } |
1235 | 448 | break; |
1236 | 448 | } |
1237 | 1.81k | } |
1238 | 594 | free(rafdata); |
1239 | 594 | break; |
1240 | 2.01k | } |
1241 | 4.75M | } |
1242 | 831 | } |
1243 | 1.77k | } |
1244 | 11.1k | FORC4 fwb[c] = get4(); |
1245 | 2.78k | if (fwb[3] < 0x100) { |
1246 | 2.88k | FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c]; |
1247 | 960 | icWBC[fwb[3]][3] = icWBC[fwb[3]][1]; |
1248 | 960 | } |
1249 | 2.78k | } |
1250 | 2.98k | break; |
1251 | 1.39k | case 0xf00d: |
1252 | 1.39k | if (imFuji.RAFDataGeneration != 4096) |
1253 | 1.33k | { |
1254 | 4.00k | FORC3 icWBC[LIBRAW_WBI_Auto][GRBG_2_RGBG(c)] = getint(type); |
1255 | 1.33k | icWBC[LIBRAW_WBI_Auto][3] = icWBC[LIBRAW_WBI_Auto][1]; |
1256 | 1.33k | } |
1257 | 1.39k | break; |
1258 | 133 | case 0xc615: /* 50709, LocalizedCameraModel */ |
1259 | 133 | stmread(imgdata.color.LocalizedCameraModel, len, ifp); |
1260 | 133 | break; |
1261 | 4.88k | case 0xf00a: // 61450 |
1262 | 4.88k | cblack[4] = cblack[5] = int(MIN(sqrtf((float)len), 64.f)); |
1263 | 6.75k | case 0xc61a: /* 50714, BlackLevel */ |
1264 | 6.75k | if (tiff_ifd[ifd].samples > 1 && |
1265 | 2.21k | tiff_ifd[ifd].samples == (int)len) // LinearDNG, per-channel black |
1266 | 724 | { |
1267 | 724 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1268 | 3.21k | for (i = 0; i < 4 && i < (int)len; i++) |
1269 | 2.49k | { |
1270 | 2.49k | tiff_ifd[ifd].dng_levels.dng_fcblack[i] = getrealf(type); |
1271 | 2.49k | tiff_ifd[ifd].dng_levels.dng_cblack[i] = cblack[i] = |
1272 | 2.49k | unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[i] + 0.5f); |
1273 | 2.49k | } |
1274 | | // Record len in last cblack field |
1275 | 724 | tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] = len; |
1276 | | |
1277 | 724 | tiff_ifd[ifd].dng_levels.dng_fblack = 0.f; |
1278 | 724 | tiff_ifd[ifd].dng_levels.dng_black = black = 0; |
1279 | 724 | } |
1280 | 6.02k | else if (tiff_ifd[ifd].samples > 1 // Linear DNG w repeat dim |
1281 | 1.48k | && (tiff_ifd[ifd].samples * cblack[4] * cblack[5] == len)) |
1282 | 505 | { |
1283 | 505 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1284 | 505 | tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] = |
1285 | 505 | cblack[LIBRAW_CBLACK_SIZE - 1] = len; |
1286 | 13.4k | for (i = 0; i < (int)len && i < LIBRAW_CBLACK_SIZE - 7; i++) |
1287 | 12.9k | { |
1288 | 12.9k | tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] = getrealf(type); |
1289 | 12.9k | tiff_ifd[ifd].dng_levels.dng_cblack[i + 6] = cblack[i + 6] = |
1290 | 12.9k | unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] + 0.5f); |
1291 | 12.9k | } |
1292 | 505 | } |
1293 | 5.52k | else if ((cblack[4] * cblack[5] < 2) && len == 1) |
1294 | 706 | { |
1295 | 706 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1296 | 706 | tiff_ifd[ifd].dng_levels.dng_fblack = getrealf(type); |
1297 | 706 | black = tiff_ifd[ifd].dng_levels.dng_black = |
1298 | 706 | unsigned(tiff_ifd[ifd].dng_levels.dng_fblack); |
1299 | 706 | } |
1300 | 4.81k | else if (cblack[4] * cblack[5] <= len) |
1301 | 4.51k | { |
1302 | 4.51k | FORC(int(cblack[4] * cblack[5])) |
1303 | 2.19M | { |
1304 | 2.19M | tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c] = getrealf(type); |
1305 | 2.19M | cblack[6 + c] = unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c]); |
1306 | 2.19M | } |
1307 | 4.51k | black = 0; |
1308 | 4.51k | FORC4 |
1309 | 18.0k | cblack[c] = 0; |
1310 | | |
1311 | 4.51k | if (tag == 0xc61a) |
1312 | 917 | { |
1313 | 917 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1314 | 917 | FORC(int(cblack[4] * cblack[5])) |
1315 | 5.31k | tiff_ifd[ifd].dng_levels.dng_cblack[6 + c] = cblack[6 + c]; |
1316 | 917 | tiff_ifd[ifd].dng_levels.dng_fblack = 0; |
1317 | 917 | tiff_ifd[ifd].dng_levels.dng_black = 0; |
1318 | 917 | FORC4 |
1319 | 3.66k | { |
1320 | 3.66k | tiff_ifd[ifd].dng_levels.dng_fcblack[c] = 0.f; |
1321 | 3.66k | tiff_ifd[ifd].dng_levels.dng_cblack[c] = 0; |
1322 | 3.66k | } |
1323 | 917 | } |
1324 | 4.51k | } |
1325 | 6.75k | break; |
1326 | 356 | case 0xc61b: /* 50715, BlackLevelDeltaH */ |
1327 | 1.25k | case 0xc61c: /* 50716, BlackLevelDeltaV */ |
1328 | 299k | for (num = i = 0; i < (int)len && i < 65536; i++) |
1329 | 298k | num += getreal(type); |
1330 | 1.25k | if (len > 0) |
1331 | 921 | { |
1332 | 921 | black += unsigned(num / len + 0.5); |
1333 | 921 | tiff_ifd[ifd].dng_levels.dng_fblack += float(num / len); |
1334 | 921 | tiff_ifd[ifd].dng_levels.dng_black += unsigned(num / len + 0.5); |
1335 | 921 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; |
1336 | 921 | } |
1337 | 1.25k | break; |
1338 | 2.02k | case 0xc61d: /* 50717, WhiteLevel */ |
1339 | 2.02k | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_WHITE; |
1340 | 2.02k | tiff_ifd[ifd].dng_levels.dng_whitelevel[0] = maximum = getint(type); |
1341 | 2.02k | if (tiff_ifd[ifd].samples > 1) // Linear DNG case |
1342 | 3.91k | for (i = 1; i < 4 && i < (int)len; i++) |
1343 | 2.60k | tiff_ifd[ifd].dng_levels.dng_whitelevel[i] = getint(type); |
1344 | 2.02k | break; |
1345 | 2.10k | case 0xc61e: /* DefaultScale */ |
1346 | 2.10k | { |
1347 | 2.10k | float q1 = getrealf(type); |
1348 | 2.10k | float q2 = getrealf(type); |
1349 | 2.10k | if (q1 > 0.00001f && q2 > 0.00001f) |
1350 | 1.46k | { |
1351 | 1.46k | pixel_aspect = q1 / q2; |
1352 | 1.46k | if (pixel_aspect > 0.995 && pixel_aspect < 1.005) |
1353 | 366 | pixel_aspect = 1.0; |
1354 | 1.46k | } |
1355 | 2.10k | } |
1356 | 2.10k | break; |
1357 | 970 | case 0xc61f: /* 50719, DefaultCropOrigin */ |
1358 | 970 | if (len == 2) |
1359 | 564 | { |
1360 | 564 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPORIGIN; |
1361 | 564 | tiff_ifd[ifd].dng_levels.default_crop[0] = ushort(getreal(type)); |
1362 | 564 | tiff_ifd[ifd].dng_levels.default_crop[1] = ushort(getreal(type)); |
1363 | 564 | if (!strncasecmp(make, "SONY", 4)) |
1364 | 160 | { |
1365 | 160 | imgdata.sizes.raw_inset_crops[0].cleft = |
1366 | 160 | tiff_ifd[ifd].dng_levels.default_crop[0]; |
1367 | 160 | imgdata.sizes.raw_inset_crops[0].ctop = |
1368 | 160 | tiff_ifd[ifd].dng_levels.default_crop[1]; |
1369 | 160 | } |
1370 | 564 | } |
1371 | 970 | break; |
1372 | | |
1373 | 1.52k | case 0xc620: /* 50720, DefaultCropSize */ |
1374 | 1.52k | if (len == 2) |
1375 | 660 | { |
1376 | 660 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPSIZE; |
1377 | 660 | tiff_ifd[ifd].dng_levels.default_crop[2] = ushort(getreal(type)); |
1378 | 660 | tiff_ifd[ifd].dng_levels.default_crop[3] = ushort(getreal(type)); |
1379 | 660 | if (!strncasecmp(make, "SONY", 4)) |
1380 | 95 | { |
1381 | 95 | imgdata.sizes.raw_inset_crops[0].cwidth = |
1382 | 95 | tiff_ifd[ifd].dng_levels.default_crop[2]; |
1383 | 95 | imgdata.sizes.raw_inset_crops[0].cheight = |
1384 | 95 | tiff_ifd[ifd].dng_levels.default_crop[3]; |
1385 | 95 | } |
1386 | 660 | } |
1387 | 1.52k | break; |
1388 | | |
1389 | 3.83k | case 0xc7b5: /* 51125 DefaultUserCrop */ |
1390 | 3.83k | if (len == 4) |
1391 | 2.71k | { |
1392 | 2.71k | int cnt = 0; |
1393 | 2.71k | FORC4 |
1394 | 10.8k | { |
1395 | 10.8k | float v = getrealf(type); |
1396 | 10.8k | if (v >= 0.f && v <= 1.f) |
1397 | 5.27k | { |
1398 | 5.27k | tiff_ifd[ifd].dng_levels.user_crop[c] = v; |
1399 | 5.27k | cnt++; |
1400 | 5.27k | } |
1401 | 10.8k | } |
1402 | 2.71k | if(cnt == 4 // valid values |
1403 | 985 | && tiff_ifd[ifd].dng_levels.user_crop[0] < tiff_ifd[ifd].dng_levels.user_crop[2] // top < bottom |
1404 | 791 | && tiff_ifd[ifd].dng_levels.user_crop[1] < tiff_ifd[ifd].dng_levels.user_crop[3] // left < right |
1405 | 2.71k | ) |
1406 | 580 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_USERCROP; |
1407 | 2.71k | } |
1408 | 3.83k | break; |
1409 | 426 | case 0x74c7: |
1410 | 426 | if ((len == 2) && !strncasecmp(make, "SONY", 4)) |
1411 | 99 | { |
1412 | 99 | imgdata.sizes.raw_inset_crops[0].cleft = get4(); |
1413 | 99 | imgdata.sizes.raw_inset_crops[0].ctop = get4(); |
1414 | 99 | } |
1415 | 426 | break; |
1416 | | |
1417 | 650 | case 0x74c8: |
1418 | 650 | if ((len == 2) && !strncasecmp(make, "SONY", 4)) |
1419 | 92 | { |
1420 | 92 | imgdata.sizes.raw_inset_crops[0].cwidth = get4(); |
1421 | 92 | imgdata.sizes.raw_inset_crops[0].cheight = get4(); |
1422 | 92 | } |
1423 | 650 | break; |
1424 | | |
1425 | 598 | case 0xc65a: // 50778 |
1426 | 598 | tiff_ifd[ifd].dng_color[0].illuminant = get2(); |
1427 | 598 | tiff_ifd[ifd].dng_color[0].parsedfields |= LIBRAW_DNGFM_ILLUMINANT; |
1428 | 598 | break; |
1429 | 308 | case 0xc65b: // 50779 |
1430 | 308 | tiff_ifd[ifd].dng_color[1].illuminant = get2(); |
1431 | 308 | tiff_ifd[ifd].dng_color[1].parsedfields |= LIBRAW_DNGFM_ILLUMINANT; |
1432 | 308 | break; |
1433 | | |
1434 | 1.62k | case 0xc621: /* 50721, ColorMatrix1 */ |
1435 | 2.25k | case 0xc622: /* 50722, ColorMatrix2 */ |
1436 | 2.25k | { |
1437 | 2.25k | int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0); |
1438 | 2.25k | i = tag == 0xc621 ? 0 : 1; |
1439 | 2.25k | if (chan) |
1440 | 1.21k | { |
1441 | 1.21k | tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_COLORMATRIX; |
1442 | 1.21k | imHassy.nIFD_CM[i] = ifd; |
1443 | 1.21k | } |
1444 | 15.7k | FORC(chan) for (j = 0; j < 3; j++) |
1445 | 11.7k | { |
1446 | 11.7k | cm[c][j] = getreal(type); |
1447 | 11.7k | tiff_ifd[ifd].dng_color[i].colormatrix[c][j] = float(cm[c][j]); |
1448 | 11.7k | } |
1449 | 2.25k | use_cm = 1; |
1450 | 2.25k | } |
1451 | 2.25k | break; |
1452 | | |
1453 | 575 | case 0xc714: /* ForwardMatrix1 */ |
1454 | 1.04k | case 0xc715: /* ForwardMatrix2 */ |
1455 | 1.04k | { |
1456 | 1.04k | int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0); |
1457 | 1.04k | i = tag == 0xc714 ? 0 : 1; |
1458 | 1.04k | if (chan) |
1459 | 409 | tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_FORWARDMATRIX; |
1460 | 4.18k | for (j = 0; j < 3; j++) |
1461 | 3.13k | FORC(chan) |
1462 | 4.24k | { |
1463 | 4.24k | fm[j][c] = getreal(type); |
1464 | 4.24k | tiff_ifd[ifd].dng_color[i].forwardmatrix[j][c] = float(fm[j][c]); |
1465 | 4.24k | } |
1466 | 1.04k | } |
1467 | 1.04k | break; |
1468 | | |
1469 | 579 | case 0xc623: /* 50723, CameraCalibration1 */ |
1470 | 928 | case 0xc624: /* 50724, CameraCalibration2 */ |
1471 | 928 | { |
1472 | 928 | int chan = (len == 9) ? 3 : (len == 16 ? 4 : 0); |
1473 | 928 | j = tag == 0xc623 ? 0 : 1; |
1474 | 928 | if (chan) |
1475 | 563 | tiff_ifd[ifd].dng_color[j].parsedfields |= LIBRAW_DNGFM_CALIBRATION; |
1476 | 2.81k | for (i = 0; i < chan; i++) |
1477 | 1.88k | FORC(chan) |
1478 | 6.43k | { |
1479 | 6.43k | cc[i][c] = getreal(type); |
1480 | 6.43k | tiff_ifd[ifd].dng_color[j].calibration[i][c] = float(cc[i][c]); |
1481 | 6.43k | } |
1482 | 928 | } |
1483 | 928 | break; |
1484 | 1.35k | case 0xc627: /* 50727, AnalogBalance */ |
1485 | 1.35k | if (len >= 3) |
1486 | 819 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ANALOGBALANCE; |
1487 | 4.81k | for (c = 0; c < (int)len && c < 4; c++) |
1488 | 3.46k | { |
1489 | 3.46k | ab[c] = getreal(type); |
1490 | 3.46k | tiff_ifd[ifd].dng_levels.analogbalance[c] = float(ab[c]); |
1491 | 3.46k | } |
1492 | 1.35k | break; |
1493 | 1.47k | case 0xc628: /* 50728, AsShotNeutral */ |
1494 | 1.47k | if (len >= 3) |
1495 | 1.06k | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ASSHOTNEUTRAL; |
1496 | 5.77k | for (c = 0; c < (int)len && c < 4; c++) |
1497 | 4.30k | { |
1498 | 4.30k | asn[c] = getreal(type); |
1499 | 4.30k | tiff_ifd[ifd].dng_levels.asshotneutral[c] = float(asn[c]); |
1500 | 4.30k | } |
1501 | 1.47k | break; |
1502 | 419 | case 0xc629: /* 50729, AsShotWhiteXY */ |
1503 | 419 | xyz[0] = getreal(type); |
1504 | 419 | xyz[1] = getreal(type); |
1505 | 419 | xyz[2] = 1 - xyz[0] - xyz[1]; |
1506 | 1.25k | FORC3 xyz[c] /= LibRaw_constants::d65_white[c]; |
1507 | 419 | break; |
1508 | 816 | case 0xc62a: /* DNG: 50730 BaselineExposure */ |
1509 | 816 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BASELINEEXPOSURE; |
1510 | 816 | tiff_ifd[ifd].dng_levels.baseline_exposure = getrealf(type); |
1511 | 816 | break; |
1512 | 698 | case 0xc62e: /* DNG: 50734 LinearResponseLimit */ |
1513 | 698 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINEARRESPONSELIMIT; |
1514 | 698 | tiff_ifd[ifd].dng_levels.LinearResponseLimit = getrealf(type); |
1515 | 698 | break; |
1516 | | |
1517 | 73.7k | case 0xc634: /* 50740 : DNG Adobe, DNG Pentax, Sony SR2, DNG Private */ |
1518 | 73.7k | { |
1519 | 73.7k | char mbuf[64]; |
1520 | 73.7k | INT64 curr_pos, start_pos = ftell(ifp); |
1521 | 73.7k | unsigned MakN_order, m_sorder = order; |
1522 | 73.7k | unsigned MakN_length; |
1523 | 73.7k | unsigned pos_in_original_raw; |
1524 | 73.7k | fread(mbuf, 1, 6, ifp); |
1525 | | |
1526 | 73.7k | if (!strcmp(mbuf, "Adobe")) |
1527 | 34.1k | { |
1528 | 34.1k | order = 0x4d4d; // Adobe header is always in "MM" / big endian |
1529 | 34.1k | curr_pos = start_pos + 6; |
1530 | 3.49M | while (curr_pos + 8 - start_pos <= len) |
1531 | 3.48M | { |
1532 | 3.48M | fread(mbuf, 1, 4, ifp); |
1533 | 3.48M | curr_pos += 8; |
1534 | | |
1535 | 3.48M | if (!strncmp(mbuf, "Pano", 4)) |
1536 | 134k | { // PanasonicRaw, yes, they use "Pano" as signature |
1537 | 134k | parseAdobePanoMakernote(); |
1538 | 134k | } |
1539 | | |
1540 | 3.48M | if (!strncmp(mbuf, "MakN", 4)) |
1541 | 30.5k | { |
1542 | 30.5k | MakN_length = get4(); |
1543 | 30.5k | MakN_order = get2(); |
1544 | 30.5k | pos_in_original_raw = get4(); |
1545 | 30.5k | order = MakN_order; |
1546 | | |
1547 | 30.5k | INT64 save_pos = ifp->tell(); |
1548 | 30.5k | parse_makernote_0xc634(curr_pos + 6 - pos_in_original_raw, 0, |
1549 | 30.5k | AdobeDNG); |
1550 | | |
1551 | 30.5k | curr_pos = save_pos + MakN_length - 6; |
1552 | 30.5k | fseek(ifp, curr_pos, SEEK_SET); |
1553 | | |
1554 | 30.5k | fread(mbuf, 1, 4, ifp); |
1555 | 30.5k | curr_pos += 8; |
1556 | | |
1557 | 30.5k | if (!strncmp(mbuf, "Pano ", 4)) |
1558 | 24 | { |
1559 | 24 | parseAdobePanoMakernote(); |
1560 | 24 | } |
1561 | | |
1562 | 30.5k | if (!strncmp(mbuf, "RAF ", 4)) |
1563 | 23.3k | { // Fujifilm Raw, AdobeRAF |
1564 | 23.3k | try { |
1565 | 23.3k | parseAdobeRAFMakernote(); // May raise exception for out-of buffer reads |
1566 | 23.3k | } |
1567 | 23.3k | catch (...) |
1568 | 23.3k | { |
1569 | | // just ignore it |
1570 | 6.21k | } |
1571 | 23.3k | } |
1572 | | |
1573 | 30.5k | if (!strncmp(mbuf, "SR2 ", 4)) |
1574 | 586 | { |
1575 | 586 | order = 0x4d4d; |
1576 | 586 | MakN_length = get4(); |
1577 | 586 | MakN_order = get2(); |
1578 | 586 | pos_in_original_raw = get4(); |
1579 | 586 | order = MakN_order; |
1580 | | |
1581 | 586 | unsigned *buf_SR2; |
1582 | 586 | unsigned SR2SubIFDOffset = 0; |
1583 | 586 | unsigned SR2SubIFDLength = 0; |
1584 | 586 | unsigned SR2SubIFDKey = 0; |
1585 | 586 | { |
1586 | 586 | INT64 _base = curr_pos + 6 - pos_in_original_raw; |
1587 | 586 | unsigned _entries, _tag, _type, _len; |
1588 | 586 | INT64 _save; |
1589 | 586 | _entries = get2(); |
1590 | 114k | while (_entries--) |
1591 | 113k | { |
1592 | 113k | tiff_get(_base, &_tag, &_type, &_len, &_save); |
1593 | 113k | if (callbacks.exif_cb) |
1594 | 0 | { |
1595 | 0 | INT64 _savepos = ftell(ifp); |
1596 | 0 | callbacks.exif_cb(callbacks.exifparser_data, tag | 0x60000, |
1597 | 0 | _type, _len, order, ifp, base); |
1598 | 0 | fseek(ifp, _savepos, SEEK_SET); |
1599 | 0 | } |
1600 | | |
1601 | 113k | if (_tag == 0x7200) |
1602 | 130 | { |
1603 | 130 | SR2SubIFDOffset = get4(); |
1604 | 130 | } |
1605 | 113k | else if (_tag == 0x7201) |
1606 | 327 | { |
1607 | 327 | SR2SubIFDLength = get4(); |
1608 | 327 | } |
1609 | 113k | else if (_tag == 0x7221) |
1610 | 137 | { |
1611 | 137 | SR2SubIFDKey = get4(); |
1612 | 137 | } |
1613 | 113k | fseek(ifp, _save, SEEK_SET); |
1614 | 113k | } |
1615 | 586 | } |
1616 | | |
1617 | 586 | if (SR2SubIFDLength && (SR2SubIFDLength < 10240000) && |
1618 | 100 | (buf_SR2 = (unsigned *)calloc(SR2SubIFDLength + 1024,1))) |
1619 | 100 | { // 1024b for safety |
1620 | 100 | fseek(ifp, SR2SubIFDOffset + base, SEEK_SET); |
1621 | 100 | int items = fread(buf_SR2, 1, SR2SubIFDLength, ifp); |
1622 | 100 | if (items == SR2SubIFDLength) |
1623 | 57 | { |
1624 | 57 | sony_decrypt(buf_SR2, SR2SubIFDLength / 4, 1, SR2SubIFDKey); |
1625 | 57 | parseSonySR2((uchar *)buf_SR2, SR2SubIFDOffset, |
1626 | 57 | SR2SubIFDLength, AdobeDNG); |
1627 | 57 | } |
1628 | 100 | free(buf_SR2); |
1629 | 100 | } |
1630 | | |
1631 | 586 | } /* SR2 processed */ |
1632 | 30.5k | break; |
1633 | 30.5k | } |
1634 | 3.48M | } |
1635 | 34.1k | } |
1636 | 39.6k | else |
1637 | 39.6k | { |
1638 | 39.6k | fread(mbuf + 6, 1, 2, ifp); |
1639 | 39.6k | if (!strcmp(mbuf, "RICOH") && ((sget2((uchar *)mbuf + 6) == 0x4949) || |
1640 | 567 | (sget2((uchar *)mbuf + 6) == 0x4d4d))) |
1641 | 12.2k | { |
1642 | 12.2k | is_PentaxRicohMakernotes = 1; |
1643 | 12.2k | } |
1644 | 39.6k | if (!strcmp(mbuf, "PENTAX ") || !strcmp(mbuf, "SAMSUNG") || |
1645 | 27.5k | is_PentaxRicohMakernotes) |
1646 | 26.5k | { |
1647 | 26.5k | fseek(ifp, start_pos, SEEK_SET); |
1648 | 26.5k | parse_makernote_0xc634(base, 0, CameraDNG); |
1649 | 26.5k | } |
1650 | 39.6k | } |
1651 | 73.7k | fseek(ifp, start_pos, SEEK_SET); |
1652 | 73.7k | order = m_sorder; |
1653 | 73.7k | } |
1654 | 73.7k | if (dng_version) |
1655 | 51.7k | { |
1656 | 51.7k | break; |
1657 | 51.7k | } |
1658 | | |
1659 | 21.9k | { |
1660 | 21.9k | INT64 jj = get4() + base; |
1661 | 21.9k | parse_minolta(jj); |
1662 | 21.9k | fseek(ifp, jj, SEEK_SET); |
1663 | 21.9k | } |
1664 | 21.9k | parse_tiff_ifd(base); |
1665 | 21.9k | break; |
1666 | 311 | case 0xc640: // 50752 |
1667 | 311 | read_shorts(cr2_slice, 3); |
1668 | 311 | break; |
1669 | 628 | case 0xc68b: /* 50827, OriginalRawFileName */ |
1670 | 628 | stmread(imgdata.color.OriginalRawFileName, len, ifp); |
1671 | 628 | break; |
1672 | 663 | case 0xc68d: /* 50829 ActiveArea */ |
1673 | 663 | tiff_ifd[ifd].t_tm = top_margin = getint(type); |
1674 | 663 | tiff_ifd[ifd].t_lm = left_margin = getint(type); |
1675 | 663 | tiff_ifd[ifd].t_vheight = height = getint(type) - top_margin; |
1676 | 663 | tiff_ifd[ifd].t_vwidth = width = getint(type) - left_margin; |
1677 | 663 | break; |
1678 | 717 | case 0xc68e: /* 50830 MaskedAreas */ |
1679 | 15.3k | for (i = 0; i < (int)len && i < 32; i++) |
1680 | 14.6k | ((int *)mask)[i] = getint(type); |
1681 | 717 | black = 0; |
1682 | 717 | break; |
1683 | 316 | case 0xc71a: /* 50970, PreviewColorSpace */ |
1684 | 316 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_PREVIEWCS; |
1685 | 316 | tiff_ifd[ifd].dng_levels.preview_colorspace = getint(type); |
1686 | 316 | break; |
1687 | 574 | case 0xc740: /* 51008, OpcodeList1 */ |
1688 | 574 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE1; |
1689 | 574 | if (len < 4 * 1024 * 1024) // 4M per opcode list limit |
1690 | 574 | { |
1691 | 574 | tiff_ifd[ifd].dng_levels.rawopcodes[0].len = len; |
1692 | 574 | tiff_ifd[ifd].dng_levels.rawopcodes[0].data = calloc(len,1); |
1693 | 574 | fread(tiff_ifd[ifd].dng_levels.rawopcodes[0].data, 1, len, ifp); |
1694 | 574 | } |
1695 | 574 | break; |
1696 | 257 | case 0xc741: /* 51009, OpcodeList2 */ |
1697 | 257 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE2; |
1698 | 257 | tiff_ifd[ifd].opcode2_offset = meta_offset = ftell(ifp); |
1699 | 257 | if (len < 4 * 1024 * 1024) // 4M per opcode list limit |
1700 | 257 | { |
1701 | 257 | tiff_ifd[ifd].dng_levels.rawopcodes[1].len = len; |
1702 | 257 | tiff_ifd[ifd].dng_levels.rawopcodes[1].data = calloc(len,1); |
1703 | 257 | fread(tiff_ifd[ifd].dng_levels.rawopcodes[1].data, 1, len, ifp); |
1704 | 257 | } |
1705 | 257 | break; |
1706 | 163 | case 0xc74e: /* 51022, OpcodeList3 */ |
1707 | 163 | tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE3; |
1708 | 163 | if (len < 4 * 1024 * 1024) // 4M per opcode list limit |
1709 | 163 | { |
1710 | 163 | tiff_ifd[ifd].dng_levels.rawopcodes[2].len = len; |
1711 | 163 | tiff_ifd[ifd].dng_levels.rawopcodes[2].data = calloc(len,1); |
1712 | 163 | fread(tiff_ifd[ifd].dng_levels.rawopcodes[2].data, 1, len, ifp); |
1713 | 163 | } |
1714 | 163 | break; |
1715 | 1.05k | case 0xfd04: /* 64772, Kodak P-series */ |
1716 | 1.05k | if (len < 13) |
1717 | 260 | break; |
1718 | 798 | fseek(ifp, 16, SEEK_CUR); |
1719 | 798 | data_offset = get4(); |
1720 | 798 | fseek(ifp, 28, SEEK_CUR); |
1721 | 798 | data_offset += get4(); |
1722 | 798 | load_raw = &LibRaw::packed_load_raw; |
1723 | 798 | break; |
1724 | 859 | case 0xfe02: // 65026 |
1725 | 859 | if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII)) |
1726 | 315 | fgets(model2, 64, ifp); |
1727 | 6.47M | } |
1728 | 6.45M | fseek(ifp, save, SEEK_SET); |
1729 | 6.45M | } |
1730 | 133k | if (sony_length && sony_length < 10240000 && |
1731 | 545 | (buf = (unsigned *)calloc(sony_length, 1))) |
1732 | 545 | { |
1733 | 545 | fseek(ifp, sony_offset, SEEK_SET); |
1734 | 545 | int items = fread(buf, 1, sony_length, ifp); |
1735 | 545 | if (items == sony_length) |
1736 | 456 | { |
1737 | 456 | sony_decrypt(buf, sony_length / 4, 1, sony_key); |
1738 | 456 | parseSonySR2((uchar *)buf, sony_offset, sony_length, nonDNG); |
1739 | 456 | } |
1740 | 545 | free(buf); |
1741 | 545 | } |
1742 | 530k | for (i = 0; i < colors && i < 4; i++) |
1743 | 1.20M | FORCC cc[i][c] *= ab[i]; |
1744 | 133k | if (use_cm) |
1745 | 1.09k | { |
1746 | 36.0k | FORCC for (i = 0; i < 3; i++) for (cam_xyz[c][i] = j = 0; j < colors; j++) |
1747 | 27.1k | cam_xyz[c][i] += cc[c][j] * cm[j][i] * xyz[i]; |
1748 | 1.09k | cam_xyz_coeff(cmatrix, cam_xyz); |
1749 | 1.09k | } |
1750 | 133k | if (asn[0]) |
1751 | 904 | { |
1752 | 904 | cam_mul[3] = 0; |
1753 | 904 | FORCC |
1754 | 2.47k | if (fabs(asn[c]) > 0.0001) |
1755 | 1.76k | cam_mul[c] = float(1. / asn[c]); |
1756 | 904 | } |
1757 | 133k | if (!use_cm) |
1758 | 394k | FORCC if (fabs(cc[c][c]) > 0.0001) pre_mul[c] /= float(cc[c][c]); |
1759 | 133k | return 0; |
1760 | 161k | } |
1761 | | |
1762 | | int LibRaw::parse_tiff(INT64 _base) |
1763 | 71.2k | { |
1764 | 71.2k | INT64 base = _base; |
1765 | 71.2k | int doff; |
1766 | 71.2k | fseek(ifp, base, SEEK_SET); |
1767 | 71.2k | order = get2(); |
1768 | 71.2k | if (order != 0x4949 && order != 0x4d4d) |
1769 | 17.3k | return 0; |
1770 | 53.9k | get2(); |
1771 | 118k | while ((doff = get4())) |
1772 | 104k | { |
1773 | 104k | INT64 doff64 = doff; |
1774 | 104k | if (doff64 + base > ifp->size()) break; |
1775 | 78.9k | fseek(ifp, doff64 + base, SEEK_SET); |
1776 | 78.9k | if (parse_tiff_ifd(_base)) |
1777 | 14.0k | break; |
1778 | 78.9k | } |
1779 | 53.9k | return 1; |
1780 | 71.2k | } |
1781 | | |
1782 | | struct ifd_size_t |
1783 | | { |
1784 | | int ifdi; |
1785 | | INT64 databits; |
1786 | | }; |
1787 | | |
1788 | | int ifd_size_t_cmp(const void *a, const void *b) |
1789 | 0 | { |
1790 | 0 | if (!a || !b) |
1791 | 0 | return 0; |
1792 | 0 | const ifd_size_t *ai = (ifd_size_t *)a; |
1793 | 0 | const ifd_size_t *bi = (ifd_size_t *)b; |
1794 | 0 | return bi->databits > ai->databits ? 1 |
1795 | 0 | : (bi->databits < ai->databits ? -1 : 0); |
1796 | 0 | } |
1797 | | |
1798 | | static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG); |
1799 | | |
1800 | | void LibRaw::apply_tiff() |
1801 | 42.7k | { |
1802 | 42.7k | int max_samp = 0, ties = 0, raw = -1, thm = -1, i; |
1803 | 42.7k | unsigned long long ns, os; |
1804 | 42.7k | struct jhead jh; |
1805 | | |
1806 | 42.7k | thumb_misc = 16; |
1807 | 42.7k | if (thumb_offset) |
1808 | 4.92k | { |
1809 | 4.92k | fseek(ifp, thumb_offset, SEEK_SET); |
1810 | 4.92k | if (ljpeg_start(&jh, 1)) |
1811 | 168 | { |
1812 | 168 | if ((unsigned)jh.bits < 17 && (unsigned)jh.wide < 0x10000 && |
1813 | 166 | (unsigned)jh.high < 0x10000) |
1814 | 166 | { |
1815 | 166 | thumb_misc = jh.bits; |
1816 | 166 | thumb_width = jh.wide; |
1817 | 166 | thumb_height = jh.high; |
1818 | 166 | } |
1819 | 168 | } |
1820 | 4.92k | } |
1821 | 308k | for (i = tiff_nifds; i--;) |
1822 | 265k | { |
1823 | 265k | if (tiff_ifd[i].t_shutter) |
1824 | 7.14k | shutter = tiff_ifd[i].t_shutter; |
1825 | 265k | tiff_ifd[i].t_shutter = shutter; |
1826 | 265k | } |
1827 | | |
1828 | 42.7k | if (dng_version) |
1829 | 12.8k | { |
1830 | 12.8k | int ifdc = 0; |
1831 | 111k | for (i = 0; i < (int)tiff_nifds; i++) |
1832 | 99.1k | { |
1833 | 99.1k | if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 || |
1834 | 35.3k | tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535) |
1835 | 70.3k | continue; /* wrong image dimensions */ |
1836 | | |
1837 | 28.8k | int samp = tiff_ifd[i].samples; |
1838 | 28.8k | if (samp == 2) |
1839 | 2.05k | samp = 1; // Fuji 2-frame |
1840 | 28.8k | max_samp = LIM(MAX(max_samp, samp), 1, |
1841 | 28.8k | 3); // max_samp is needed for thumbnail selection below |
1842 | | |
1843 | 28.8k | if ( // Check phint only for RAW subfiletype |
1844 | 28.8k | (tiff_ifd[i].newsubfiletype == 16 |
1845 | 27.8k | || tiff_ifd[i].newsubfiletype == 0 |
1846 | 2.48k | || (tiff_ifd[i].newsubfiletype & 0xffff) == 1) |
1847 | 27.0k | && |
1848 | 27.0k | (tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892) |
1849 | 28.8k | ) |
1850 | 2.02k | continue; |
1851 | | |
1852 | 26.8k | if ((tiff_ifd[i].newsubfiletype == 0) // main image |
1853 | | // Enhanced demosaiced: |
1854 | 3.07k | || (tiff_ifd[i].newsubfiletype == 16 && |
1855 | 800 | (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_ENHANCED)) |
1856 | | // Preview: 0x1 or 0x10001 |
1857 | 3.07k | || ((tiff_ifd[i].newsubfiletype & 0xffff) == 1 && |
1858 | 532 | (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS)) |
1859 | | // Transparency mask: 0x4 |
1860 | 3.07k | || ((tiff_ifd[i].newsubfiletype & 0xffff) == 4 && |
1861 | 489 | (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_MASKS))) |
1862 | 23.7k | { |
1863 | | // Add this IFD to dng_frames |
1864 | 23.7k | libraw_internal_data.unpacker_data.dng_frames[ifdc] = |
1865 | 23.7k | ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) | ((i << 8) & 0xff00); |
1866 | 23.7k | ifdc++; |
1867 | | // Fuji SuperCCD: second frame: |
1868 | 23.7k | if ((tiff_ifd[i].newsubfiletype == 0) && tiff_ifd[i].samples == 2) |
1869 | 1.95k | { |
1870 | 1.95k | libraw_internal_data.unpacker_data.dng_frames[ifdc] = |
1871 | 1.95k | ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) | |
1872 | 1.95k | ((i << 8) & 0xff00) | 1; |
1873 | 1.95k | ifdc++; |
1874 | 1.95k | } |
1875 | 23.7k | } |
1876 | 26.8k | } |
1877 | 12.8k | if (ifdc) |
1878 | 6.94k | { |
1879 | 6.94k | if (ifdc > 1 && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_PREFER_LARGEST_IMAGE)) |
1880 | 0 | { |
1881 | 0 | ifd_size_t arr[LIBRAW_IFD_MAXCOUNT * 2]; |
1882 | 0 | memset(arr, 0, sizeof(arr)); |
1883 | 0 | for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++) |
1884 | 0 | { |
1885 | 0 | int ifdidx = |
1886 | 0 | (libraw_internal_data.unpacker_data.dng_frames[q] >> 8) & 0xff; |
1887 | 0 | arr[q].ifdi = libraw_internal_data.unpacker_data.dng_frames[q]; |
1888 | 0 | arr[q].databits = |
1889 | 0 | INT64(tiff_ifd[ifdidx].t_width) * INT64(tiff_ifd[ifdidx].t_height) * |
1890 | 0 | INT64(tiff_ifd[ifdidx].samples) * INT64(tiff_ifd[ifdidx].bps) + |
1891 | 0 | INT64(0x100 - |
1892 | 0 | (arr[q].ifdi & 0xff)); // add inverted frame # to ensure same |
1893 | | // sort order for similar sized frames. |
1894 | 0 | if (tiff_ifd[ifdidx].phint == 4) |
1895 | 0 | arr[q].databits /= 4; // Force lower bit count for Transp. mask images |
1896 | 0 | } |
1897 | 0 | qsort(arr, MIN(ifdc, LIBRAW_IFD_MAXCOUNT * 2), sizeof(arr[0]), |
1898 | 0 | ifd_size_t_cmp); |
1899 | 0 | for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++) |
1900 | 0 | libraw_internal_data.unpacker_data.dng_frames[q] = arr[q].ifdi; |
1901 | 0 | } |
1902 | | |
1903 | 6.94k | int idx = LIM((int)shot_select, 0, ifdc - 1); |
1904 | 6.94k | i = (libraw_internal_data.unpacker_data.dng_frames[idx] >> 8) & |
1905 | 6.94k | 0xff; // extract frame# back |
1906 | | |
1907 | 6.94k | raw_width = tiff_ifd[i].t_width; |
1908 | 6.94k | raw_height = tiff_ifd[i].t_height; |
1909 | 6.94k | tiff_bps = tiff_ifd[i].bps; |
1910 | 6.94k | tiff_compress = tiff_ifd[i].comp; |
1911 | 6.94k | tiff_sampleformat = tiff_ifd[i].sample_format; |
1912 | 6.94k | data_offset = tiff_ifd[i].offset; |
1913 | 6.94k | data_size = tiff_ifd[i].bytes; |
1914 | 6.94k | tiff_flip = tiff_ifd[i].t_flip; |
1915 | 6.94k | tiff_samples = tiff_ifd[i].samples; |
1916 | 6.94k | tile_width = tiff_ifd[i].t_tile_width; |
1917 | 6.94k | tile_length = tiff_ifd[i].t_tile_length; |
1918 | 6.94k | fuji_width = tiff_ifd[i].t_fuji_width; |
1919 | 6.94k | if (tiff_samples != 2) /* special case: Fuji SuperCCD */ |
1920 | 6.50k | { |
1921 | 6.50k | if (tiff_ifd[i].phint == 34892) |
1922 | 220 | filters = 0; |
1923 | 6.28k | else if (i > 0 && tiff_ifd[i].phint == 32803 && |
1924 | 2.60k | tiff_ifd[0].phint == 32803 && !tiff_ifd[i].t_filters && |
1925 | 819 | tiff_ifd[0].t_filters) |
1926 | 553 | filters = tiff_ifd[0].t_filters; |
1927 | 5.73k | else |
1928 | 5.73k | filters = tiff_ifd[i].t_filters; |
1929 | 6.50k | width = tiff_ifd[i].t_vwidth; |
1930 | 6.50k | height = tiff_ifd[i].t_vheight; |
1931 | 6.50k | top_margin = tiff_ifd[i].t_tm; |
1932 | 6.50k | left_margin = tiff_ifd[i].t_lm; |
1933 | 6.50k | shutter = tiff_ifd[i].t_shutter; |
1934 | 6.50k | if (tiff_ifd[i].dng_levels.dng_whitelevel[0]) |
1935 | 336 | maximum = tiff_ifd[i].dng_levels.dng_whitelevel[0]; |
1936 | 6.16k | else if (tiff_ifd[i].sample_format <= 2 && tiff_bps > 0 && |
1937 | 2.28k | tiff_bps < 32) // SampleFormat: 0-default(1), 1 - Uint, 2 - Int |
1938 | 1.57k | maximum = (1 << tiff_bps) - 1; |
1939 | 4.59k | else if (tiff_ifd[i].sample_format == 3) |
1940 | 2.13k | maximum = 1; // Defaults for FP |
1941 | 6.50k | } |
1942 | 6.94k | raw = i; |
1943 | 6.94k | is_raw = ifdc; |
1944 | 6.94k | } |
1945 | 5.86k | else |
1946 | 5.86k | is_raw = 0; |
1947 | 12.8k | } |
1948 | 29.9k | else |
1949 | 29.9k | { |
1950 | | // Fix for broken Sony bps tag |
1951 | 29.9k | if (!strncasecmp(make, "Sony", 4)) |
1952 | 2.68k | { |
1953 | 18.7k | for (i = 0; i < (int)tiff_nifds; i++) |
1954 | 16.0k | { |
1955 | 16.0k | if (tiff_ifd[i].bps > 33 && tiff_ifd[i].samples == 1) |
1956 | 234 | { |
1957 | 234 | int bps = 14; // default |
1958 | 234 | if (tiff_ifd[i].dng_levels.dng_whitelevel[0] > 0) |
1959 | 124 | { |
1960 | 1.17k | for(int c = 0,j=1; c < 16; c++, j<<=1) |
1961 | 1.15k | if (j > (int)tiff_ifd[i].dng_levels.dng_whitelevel[0]) |
1962 | 110 | { |
1963 | 110 | bps = c; break; |
1964 | 110 | } |
1965 | 124 | } |
1966 | 234 | tiff_ifd[i].bps = bps; |
1967 | 234 | } |
1968 | 16.0k | } |
1969 | 2.68k | } |
1970 | | |
1971 | 196k | for (i = 0; i < (int)tiff_nifds; i++) |
1972 | 166k | { |
1973 | 166k | if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 || |
1974 | 64.9k | tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535) |
1975 | 109k | continue; /* wrong image dimensions */ |
1976 | 57.3k | if (max_samp < tiff_ifd[i].samples) |
1977 | 12.1k | max_samp = tiff_ifd[i].samples; |
1978 | 57.3k | if (max_samp > 3) |
1979 | 3.42k | max_samp = 3; |
1980 | | |
1981 | 57.3k | os = unsigned(raw_width) * unsigned(raw_height); |
1982 | 57.3k | ns = unsigned(tiff_ifd[i].t_width) * unsigned(tiff_ifd[i].t_height); |
1983 | 57.3k | if (tiff_bps) |
1984 | 40.9k | { |
1985 | 40.9k | os *= tiff_bps; |
1986 | 40.9k | ns *= tiff_ifd[i].bps; |
1987 | 40.9k | } |
1988 | | /* too complex if below, so separate if to skip RGB+Alpha TIFFs*/ |
1989 | 57.3k | if (tiff_ifd[i].phint == 2 && tiff_ifd[i].extrasamples > 0 && tiff_ifd[i].samples > 3) |
1990 | 2.34k | continue; // SKIP RGB+Alpha IFDs |
1991 | | |
1992 | 54.9k | if (!strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps == 8 && tiff_ifd[i].phint == 6 && tiff_ifd[i].comp == 7 && |
1993 | 277 | tiff_ifd[i].samples == 3 && tiff_ifd[i].newsubfiletype == 1) |
1994 | 14 | continue; // Sony RGB preview |
1995 | | |
1996 | 54.9k | if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3 || |
1997 | 1.81k | (tiff_ifd[i].comp == 6 && tiff_ifd[i].samples == 3 && !strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps >=12) |
1998 | 54.9k | ) && |
1999 | 53.9k | unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 && |
2000 | 53.9k | (unsigned)tiff_ifd[i].bps < 33 && |
2001 | 51.6k | (unsigned)tiff_ifd[i].samples < 13 && ns && |
2002 | 51.1k | ((ns > os && (ties = 1)) || (ns == os && (int)shot_select == ties++))) |
2003 | 12.7k | { |
2004 | 12.7k | raw_width = tiff_ifd[i].t_width; |
2005 | 12.7k | raw_height = tiff_ifd[i].t_height; |
2006 | 12.7k | tiff_bps = tiff_ifd[i].bps; |
2007 | 12.7k | tiff_compress = tiff_ifd[i].comp; |
2008 | 12.7k | tiff_sampleformat = tiff_ifd[i].sample_format; |
2009 | 12.7k | data_offset = tiff_ifd[i].offset; |
2010 | 12.7k | data_size = tiff_ifd[i].bytes; |
2011 | 12.7k | tiff_flip = tiff_ifd[i].t_flip; |
2012 | 12.7k | tiff_samples = tiff_ifd[i].samples; |
2013 | 12.7k | tile_width = tiff_ifd[i].t_tile_width; |
2014 | 12.7k | tile_length = tiff_ifd[i].t_tile_length; |
2015 | 12.7k | shutter = tiff_ifd[i].t_shutter; |
2016 | 12.7k | raw = i; |
2017 | 12.7k | } |
2018 | 54.9k | } |
2019 | 29.9k | if (is_raw == 1 && ties) |
2020 | 6.71k | is_raw = ties; |
2021 | 29.9k | } |
2022 | 42.7k | if (is_NikonTransfer && raw >= 0) |
2023 | 842 | { |
2024 | 842 | if (tiff_ifd[raw].bps == 16) |
2025 | 215 | { |
2026 | 215 | if (tiff_compress == 1) |
2027 | 40 | { |
2028 | 40 | if ((INT64(raw_width) * INT64(raw_height) * 3LL) == (tiff_ifd[raw].bytes << 1)) |
2029 | 1 | { |
2030 | 1 | tiff_bps = tiff_ifd[raw].bps = 12; |
2031 | 1 | } |
2032 | 39 | else |
2033 | 39 | { |
2034 | 39 | tiff_bps = tiff_ifd[raw].bps = 14; |
2035 | 39 | } |
2036 | 40 | } |
2037 | 215 | } |
2038 | 627 | else if (tiff_ifd[raw].bps == 8) |
2039 | 571 | { |
2040 | 571 | if (tiff_compress == 1) |
2041 | 277 | { |
2042 | 277 | is_NikonTransfer = 2; // 8-bit debayered TIFF, like CoolScan NEFs |
2043 | 277 | imgdata.rawparams.coolscan_nef_gamma = 2.2f; |
2044 | 277 | } |
2045 | 571 | } |
2046 | 842 | } |
2047 | | |
2048 | 42.7k | if (!tile_width) |
2049 | 35.0k | tile_width = INT_MAX; |
2050 | 42.7k | if (!tile_length) |
2051 | 35.0k | tile_length = INT_MAX; |
2052 | 308k | for (i = tiff_nifds; i--;) |
2053 | 265k | if (tiff_ifd[i].t_flip) |
2054 | 4.08k | tiff_flip = tiff_ifd[i].t_flip; |
2055 | | |
2056 | | #if 0 |
2057 | | if (raw < 0 && is_raw) |
2058 | | is_raw = 0; |
2059 | | #endif |
2060 | | |
2061 | 42.7k | if (raw >= 0 && !load_raw) |
2062 | 14.8k | switch (tiff_compress) |
2063 | 14.8k | { |
2064 | 1.94k | case 32767: |
2065 | 1.94k | if (!dng_version && |
2066 | 1.37k | tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height)) |
2067 | 182 | { |
2068 | 182 | tiff_bps = 14; |
2069 | 182 | load_raw = &LibRaw::sony_arw2_load_raw; |
2070 | 182 | break; |
2071 | 182 | } |
2072 | 1.76k | if (!dng_version && !strncasecmp(make, "Sony", 4) && |
2073 | 457 | tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 2LL) |
2074 | 0 | { |
2075 | 0 | tiff_bps = 14; |
2076 | 0 | load_raw = &LibRaw::unpacked_load_raw; |
2077 | 0 | break; |
2078 | 0 | } |
2079 | 1.76k | if (tiff_ifd[raw].bytes * 8LL != |
2080 | 1.76k | INT64(raw_width) * INT64(raw_height) * INT64(tiff_bps)) |
2081 | 151 | { |
2082 | 151 | raw_height += 8; |
2083 | 151 | load_raw = &LibRaw::sony_arw_load_raw; |
2084 | 151 | break; |
2085 | 151 | } |
2086 | 1.60k | load_flags = 79; |
2087 | 1.82k | case 32769: |
2088 | 1.82k | load_flags++; |
2089 | 1.91k | case 32770: |
2090 | 2.27k | case 32773: |
2091 | 2.27k | goto slr; |
2092 | 7.97k | case 0: |
2093 | 8.92k | case 1: |
2094 | 8.92k | if (dng_version && tiff_sampleformat == 3 && |
2095 | 2.13k | (tiff_bps > 8 && (tiff_bps % 8 == 0) && (tiff_bps <= 32))) // only 16,24, and 32 are allowed |
2096 | 167 | { |
2097 | 167 | load_raw = &LibRaw::uncompressed_fp_dng_load_raw; |
2098 | 167 | break; |
2099 | 167 | } |
2100 | | // Sony 14-bit uncompressed |
2101 | 8.75k | if (!dng_version && !strncasecmp(make, "Sony", 4) && |
2102 | 424 | tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 2LL) |
2103 | 2 | { |
2104 | 2 | tiff_bps = 14; |
2105 | 2 | load_raw = &LibRaw::unpacked_load_raw; |
2106 | 2 | break; |
2107 | 2 | } |
2108 | 8.75k | if (!dng_version && !strncasecmp(make, "Sony", 4) && tiff_ifd[raw].samples == 4 && |
2109 | 138 | tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 8LL) // Sony ARQ |
2110 | 53 | { |
2111 | | // maybe to detect ARQ with the following: |
2112 | | // if (tiff_ifd[raw].phint == 32892) |
2113 | 53 | tiff_bps = 14; |
2114 | 53 | tiff_samples = 4; |
2115 | 53 | load_raw = &LibRaw::sony_arq_load_raw; |
2116 | 53 | filters = 0; |
2117 | 53 | strcpy(cdesc, "RGBG"); |
2118 | 53 | break; |
2119 | 53 | } |
2120 | 8.70k | if (!strncasecmp(make, "Nikon", 5) && |
2121 | 541 | (!strncmp(software, "Nikon Scan", 10) || (is_NikonTransfer == 2) || |
2122 | 463 | strcasestr(model, "COOLSCAN"))) |
2123 | 156 | { |
2124 | 156 | load_raw = &LibRaw::nikon_coolscan_load_raw; |
2125 | 156 | raw_color = 1; |
2126 | 156 | colors = (tiff_samples == 3) ? 3 : 1; |
2127 | 156 | filters = 0; |
2128 | 156 | break; |
2129 | 156 | } |
2130 | 8.54k | if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) || |
2131 | 8.00k | (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here |
2132 | 610 | (tiff_ifd[raw].bytes * 2LL == INT64(raw_width) * INT64(raw_height) * 3LL)) |
2133 | 80 | load_flags = 24; |
2134 | 8.54k | if (!dng_version && tiff_ifd[raw].bytes * 5LL == INT64(raw_width) * INT64(raw_height) * 8LL) |
2135 | 4 | { |
2136 | 4 | load_flags = 81; |
2137 | 4 | tiff_bps = 12; |
2138 | 4 | } |
2139 | 10.8k | slr: |
2140 | 10.8k | switch (tiff_bps) |
2141 | 10.8k | { |
2142 | 167 | case 8: |
2143 | 167 | load_raw = &LibRaw::eight_bit_load_raw; |
2144 | 167 | break; |
2145 | 265 | case 12: |
2146 | 265 | if (tiff_ifd[raw].phint == 2) |
2147 | 12 | load_flags = 6; |
2148 | 265 | if (!strncasecmp(make, "NIKON", 5) && |
2149 | 170 | !strncasecmp(model, "COOLPIX A1000", 13) && |
2150 | 0 | data_size == raw_width * raw_height * 2u) |
2151 | 0 | load_raw = &LibRaw::unpacked_load_raw; |
2152 | 265 | else |
2153 | 265 | load_raw = &LibRaw::packed_load_raw; |
2154 | 265 | break; |
2155 | 245 | case 14: |
2156 | 245 | load_flags = 0; |
2157 | 345 | case 16: |
2158 | 345 | load_raw = &LibRaw::unpacked_load_raw; |
2159 | 345 | if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) || |
2160 | 332 | (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here |
2161 | 14 | (tiff_ifd[raw].bytes * 7LL > INT64(raw_width) * INT64(raw_height))) |
2162 | 12 | { |
2163 | 12 | load_raw = &LibRaw::olympus_load_raw; |
2164 | 12 | } |
2165 | 10.8k | } |
2166 | 10.8k | break; |
2167 | 10.8k | case 6: |
2168 | 493 | case 7: |
2169 | 500 | case 99: |
2170 | 500 | if (!dng_version && tiff_compress == 6 && !strcasecmp(make, "SONY")) |
2171 | 36 | { |
2172 | 36 | if (tiff_ifd[raw].phint == 6 && tiff_ifd[raw].bps >= 12 && tiff_ifd[raw].samples == 3) |
2173 | 9 | { |
2174 | 9 | load_raw = &LibRaw::sony_ycbcr_load_raw; |
2175 | 9 | filters = 0; |
2176 | 9 | colors = 3; |
2177 | 9 | } |
2178 | 27 | else |
2179 | 27 | load_raw = &LibRaw::sony_ljpeg_load_raw; |
2180 | 36 | } |
2181 | | // Allow A1/Compression=7 |
2182 | 464 | else if(!dng_version && tiff_compress == 7 && !strcasecmp(make, "SONY") && |
2183 | 8 | (!strcasecmp(model,"ILCE-1") || !strncasecmp(model, "ILCE-7",6) |
2184 | 8 | || !strncasecmp(model, "ILCE-9", 6) // Most likely ILCE-9 will use tiff_compr=7 this w/ updated FW |
2185 | 8 | ) && |
2186 | 0 | tiff_bps == 14 && tiff_samples == 1) |
2187 | 0 | load_raw = &LibRaw::sony_ljpeg_load_raw; |
2188 | 464 | else |
2189 | 464 | load_raw = &LibRaw::lossless_jpeg_load_raw; |
2190 | 500 | break; |
2191 | 297 | case 262: |
2192 | 297 | load_raw = &LibRaw::kodak_262_load_raw; |
2193 | 297 | break; |
2194 | 194 | case 34713: |
2195 | 194 | if ((INT64(raw_width) + 9LL) / 10LL * 16LL * INT64(raw_height) == tiff_ifd[raw].bytes) |
2196 | 0 | { |
2197 | 0 | load_raw = &LibRaw::packed_load_raw; |
2198 | 0 | load_flags = 1; |
2199 | 0 | } |
2200 | 194 | else if (INT64(raw_width) * INT64(raw_height) * 3LL == tiff_ifd[raw].bytes * 2LL) |
2201 | 3 | { |
2202 | 3 | load_raw = &LibRaw::packed_load_raw; |
2203 | 3 | if (model[0] == 'N') |
2204 | 1 | load_flags = 80; |
2205 | 3 | } |
2206 | 191 | else if (INT64(raw_width) * INT64(raw_height) * 3LL == tiff_ifd[raw].bytes) |
2207 | 63 | { |
2208 | 63 | load_raw = &LibRaw::nikon_yuv_load_raw; |
2209 | 63 | gamma_curve(1 / 2.4, 12.92, 1, 4095); |
2210 | 63 | memset(cblack, 0, sizeof cblack); |
2211 | 63 | filters = 0; |
2212 | 63 | } |
2213 | 128 | else if (INT64(raw_width) * INT64(raw_height) * 2LL == tiff_ifd[raw].bytes) |
2214 | 2 | { |
2215 | 2 | load_raw = &LibRaw::unpacked_load_raw; |
2216 | 2 | load_flags = 4; |
2217 | 2 | order = 0x4d4d; |
2218 | 2 | } |
2219 | | #if 0 /* Never used because of same condition above, but need to recheck */ |
2220 | | else if (INT64(raw_width) * INT64(raw_height) * 3LL == |
2221 | | INT64(tiff_ifd[raw].bytes) * 2LL) |
2222 | | { |
2223 | | load_raw = &LibRaw::packed_load_raw; |
2224 | | load_flags = 80; |
2225 | | } |
2226 | | #endif |
2227 | 126 | else if (tiff_ifd[raw].rows_per_strip && |
2228 | 64 | tiff_ifd[raw].strip_offsets_count && |
2229 | 43 | tiff_ifd[raw].strip_offsets_count == |
2230 | 43 | tiff_ifd[raw].strip_byte_counts_count) |
2231 | 40 | { |
2232 | 40 | int fit = 1; |
2233 | 53 | for (int q = 0; q < tiff_ifd[raw].strip_byte_counts_count - 1; |
2234 | 40 | q++) // all but last |
2235 | 49 | if (INT64(tiff_ifd[raw].strip_byte_counts[q]) * 2LL != |
2236 | 49 | INT64(tiff_ifd[raw].rows_per_strip) * INT64(raw_width) * 3LL) |
2237 | 36 | { |
2238 | 36 | fit = 0; |
2239 | 36 | break; |
2240 | 36 | } |
2241 | 40 | if (fit) |
2242 | 4 | load_raw = &LibRaw::nikon_load_striped_packed_raw; |
2243 | 36 | else |
2244 | 36 | load_raw = &LibRaw::nikon_load_raw; // fallback |
2245 | 40 | } |
2246 | 86 | else if ((((INT64(raw_width) * 3LL / 2LL) + 15LL) / 16LL) * 16LL * INT64(raw_height) == tiff_ifd[raw].bytes) |
2247 | 3 | { |
2248 | 3 | load_raw = &LibRaw::nikon_load_padded_packed_raw; |
2249 | 3 | load_flags = (((INT64(raw_width) * 3ULL / 2ULL) + 15ULL) / 16ULL) * |
2250 | 3 | 16ULL; // bytes per row |
2251 | 3 | } |
2252 | 83 | else if ((!strncmp(model, "NIKON Z 9", 9) || !strncmp(model, "NIKON Z 8", 9) || !strcmp(model, "NIKON Z f") |
2253 | 83 | || !strcmp(model, "NIKON Z6_3")) && |
2254 | 0 | tiff_ifd[raw].offset) |
2255 | 0 | { |
2256 | 0 | INT64 pos = ftell(ifp); |
2257 | 0 | unsigned char cmp[] = {0xff, 0x10, 0xff, 0x50 }; // JpegXS SOC + Cap |
2258 | 0 | unsigned char buf[4]; |
2259 | 0 | fseek(ifp, INT64(tiff_ifd[raw].offset), SEEK_SET); |
2260 | 0 | fread(buf, 1, 4, ifp); |
2261 | 0 | fseek(ifp, pos, SEEK_SET); |
2262 | 0 | if(!memcmp(buf,cmp,4)) |
2263 | 0 | load_raw = &LibRaw::nikon_he_load_raw; |
2264 | 0 | else |
2265 | 0 | load_raw = &LibRaw::nikon_load_raw; |
2266 | 0 | } |
2267 | 83 | else |
2268 | 83 | load_raw = &LibRaw::nikon_load_raw; |
2269 | 194 | break; |
2270 | 289 | case 65535: |
2271 | 289 | load_raw = &LibRaw::pentax_load_raw; |
2272 | 289 | break; |
2273 | 392 | case 65000: |
2274 | 392 | switch (tiff_ifd[raw].phint) |
2275 | 392 | { |
2276 | 64 | case 2: |
2277 | 64 | load_raw = &LibRaw::kodak_rgb_load_raw; |
2278 | 64 | filters = 0; |
2279 | 64 | break; |
2280 | 60 | case 6: |
2281 | 60 | load_raw = &LibRaw::kodak_ycbcr_load_raw; |
2282 | 60 | filters = 0; |
2283 | 60 | break; |
2284 | 50 | case 32803: |
2285 | 50 | load_raw = &LibRaw::kodak_65000_load_raw; |
2286 | 392 | } |
2287 | 394 | case 32867: |
2288 | 733 | case 34892: |
2289 | 733 | break; |
2290 | 178 | case 8: |
2291 | 178 | break; |
2292 | 2 | case 52546: |
2293 | 2 | if (dng_version) /* DNG 1.7 JPEG XL: if not compiled w/ DNG SDK decoder will return NOT SUPPORTED*/ |
2294 | 0 | break; |
2295 | | // else: fallthrough |
2296 | 376 | case 9: |
2297 | 376 | if (dng_version) |
2298 | 261 | break; /* Compression=9 supported for dng if we compiled with GPR SDK; if NO SDK: decoder will return NOT Supported */ |
2299 | | // else: fallthrough |
2300 | 872 | default: |
2301 | 872 | is_raw = 0; |
2302 | 14.8k | } |
2303 | 42.7k | if (!dng_version) |
2304 | 29.9k | { |
2305 | 29.9k | if (((tiff_samples == 3 && tiff_ifd[raw].bytes && |
2306 | 1.98k | !(tiff_bps == 16 && |
2307 | 317 | !strncmp(make, "Leaf", 4)) && // Allow Leaf/16bit/3color files |
2308 | 1.94k | !(tiff_ifd[raw].comp == 6 && tiff_ifd[raw].phint == 6 && tiff_bps >= 12 && !strncasecmp(make,"Sony",4)) && // Sony YCbCr |
2309 | 1.94k | tiff_bps != 14 && |
2310 | 1.54k | (tiff_compress & -16) != 32768) || |
2311 | 28.4k | (tiff_bps == 8 && strncmp(make, "Phase", 5) && |
2312 | 1.37k | strncmp(make, "Leaf", 4) && !strcasestr(make, "Kodak") && |
2313 | 675 | !strstr(model2, "DEBUG RAW"))) && |
2314 | 2.15k | !strcasestr(model, "COOLSCAN") && strncmp(software, "Nikon Scan", 10) && |
2315 | 1.94k | is_NikonTransfer != 2) |
2316 | 1.70k | is_raw = 0; |
2317 | | |
2318 | 29.9k | if (is_raw && raw >= 0 && tiff_ifd[raw].phint == 2 && tiff_ifd[raw].extrasamples > 0 && tiff_ifd[raw].samples > 3) |
2319 | 0 | is_raw = 0; // SKIP RGB+Alpha IFDs |
2320 | 29.9k | } |
2321 | | |
2322 | 42.7k | INT64 fsizecheck = 0ULL; |
2323 | | |
2324 | 42.7k | if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_ALL_VENDORS) |
2325 | 0 | fsizecheck = ifp->size(); |
2326 | 42.7k | else if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_KNOWN_VENDORS) && |
2327 | 0 | (!strncasecmp(make, "Ricoh", 5) || (dng_version && !strncasecmp(make, "Samsung", 7)))) |
2328 | 0 | fsizecheck = ifp->size(); |
2329 | | |
2330 | 308k | for (i = 0; i < (int)tiff_nifds; i++) |
2331 | 265k | if (i != raw && |
2332 | 246k | (tiff_ifd[i].samples == max_samp || |
2333 | 82.2k | (tiff_ifd[i].comp == 7 && |
2334 | 934 | tiff_ifd[i].samples == 1)) /* Allow 1-bps JPEGs */ |
2335 | 164k | && tiff_ifd[i].bps > 0 && tiff_ifd[i].bps < 33 && |
2336 | 42.1k | tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892 && |
2337 | 35.2k | (tiff_ifd[i].comp != 52546 || (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS)) && |
2338 | 35.2k | unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 && |
2339 | 30.3k | tiff_ifd[i].comp != 34892) |
2340 | 29.9k | { |
2341 | 29.9k | if (fsizecheck > 0LL) |
2342 | 0 | { |
2343 | 0 | bool ok = true; |
2344 | 0 | if (tiff_ifd[i].strip_byte_counts_count && tiff_ifd[i].strip_offsets_count) |
2345 | 0 | for (int s = 0; s < MIN(tiff_ifd[i].strip_byte_counts_count, tiff_ifd[i].strip_offsets_count); s++) |
2346 | 0 | { |
2347 | 0 | if (tiff_ifd[i].strip_offsets[s] + tiff_ifd[i].strip_byte_counts[s] > fsizecheck) |
2348 | 0 | { |
2349 | 0 | ok = false; |
2350 | 0 | break; |
2351 | 0 | } |
2352 | 0 | } |
2353 | 0 | else if (tiff_ifd[i].bytes > 0) |
2354 | 0 | if (tiff_ifd[i].offset + tiff_ifd[i].bytes > fsizecheck) |
2355 | 0 | ok = false; |
2356 | |
|
2357 | 0 | if(!ok) |
2358 | 0 | continue; |
2359 | 0 | } |
2360 | 29.9k | if ( (INT64(tiff_ifd[i].t_width) * INT64(tiff_ifd[i].t_height) / INT64(SQR(tiff_ifd[i].bps) + 1)) > |
2361 | 29.9k | (INT64(thumb_width) * INT64(thumb_height) / INT64(SQR(thumb_misc) + 1)) ) |
2362 | 5.80k | { |
2363 | | |
2364 | 5.80k | thumb_width = tiff_ifd[i].t_width; |
2365 | 5.80k | thumb_height = tiff_ifd[i].t_height; |
2366 | 5.80k | thumb_offset = tiff_ifd[i].offset; |
2367 | 5.80k | thumb_length = unsigned(tiff_ifd[i].bytes); // do we expect >4GB thumbnail? |
2368 | 5.80k | thumb_misc = tiff_ifd[i].bps; |
2369 | 5.80k | thm = i; |
2370 | 5.80k | } |
2371 | 29.9k | if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT && tiff_ifd[i].bytes > 0) |
2372 | 11.7k | { |
2373 | 11.7k | bool already = false; |
2374 | 12.5k | for(int idx = 0; idx < imgdata.thumbs_list.thumbcount ; idx++) |
2375 | 11.1k | if (imgdata.thumbs_list.thumblist[idx].toffset == tiff_ifd[i].offset) |
2376 | 10.4k | { |
2377 | 10.4k | already = true; |
2378 | 10.4k | break; |
2379 | 10.4k | } |
2380 | 11.7k | if (!already) |
2381 | 1.37k | { |
2382 | 1.37k | int idx = imgdata.thumbs_list.thumbcount; |
2383 | 1.37k | imgdata.thumbs_list.thumblist[idx].tformat = tiff2thumbformat(tiff_ifd[i].comp, tiff_ifd[i].phint, |
2384 | 1.37k | tiff_ifd[i].bps, make, dng_version); |
2385 | 1.37k | imgdata.thumbs_list.thumblist[idx].twidth = tiff_ifd[i].t_width; |
2386 | 1.37k | imgdata.thumbs_list.thumblist[idx].theight = tiff_ifd[i].t_height; |
2387 | 1.37k | imgdata.thumbs_list.thumblist[idx].tflip = tiff_ifd[i].t_flip; |
2388 | 1.37k | imgdata.thumbs_list.thumblist[idx].tlength = unsigned(tiff_ifd[i].bytes); |
2389 | 1.37k | imgdata.thumbs_list.thumblist[idx].tmisc = tiff_ifd[i].bps | (tiff_ifd[i].samples << 5); |
2390 | 1.37k | imgdata.thumbs_list.thumblist[idx].toffset = tiff_ifd[i].offset; |
2391 | 1.37k | imgdata.thumbs_list.thumbcount++; |
2392 | 1.37k | } |
2393 | 11.7k | } |
2394 | 29.9k | } |
2395 | 42.7k | if (thm >= 0) |
2396 | 5.74k | { |
2397 | 5.74k | thumb_misc |= tiff_ifd[thm].samples << 5; |
2398 | 5.74k | thumb_format = tiff2thumbformat(tiff_ifd[thm].comp, tiff_ifd[thm].phint, tiff_ifd[thm].bps, make, dng_version); |
2399 | 5.74k | } |
2400 | 42.7k | } |
2401 | | |
2402 | | static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG) |
2403 | 7.11k | { |
2404 | 7.11k | switch (_comp) |
2405 | 7.11k | { |
2406 | 2.33k | case 0: |
2407 | 2.33k | return LIBRAW_INTERNAL_THUMBNAIL_LAYER; |
2408 | 2.22k | case 1: |
2409 | 2.22k | if (_bps <= 8) |
2410 | 864 | return LIBRAW_INTERNAL_THUMBNAIL_PPM; |
2411 | 1.36k | else if (!strncmp(_make, "Imacon", 6)) |
2412 | 31 | return LIBRAW_INTERNAL_THUMBNAIL_PPM16; |
2413 | 1.33k | else if (isDNG && _phint == 6 && _bps == 12) |
2414 | 1 | return LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR; |
2415 | 1.33k | else |
2416 | 1.33k | return LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB; |
2417 | 0 | case 52546: |
2418 | 0 | return LIBRAW_INTERNAL_THUMBNAIL_JPEGXL; |
2419 | 371 | case 65000: |
2420 | 371 | return _phint == 6 ? LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR : LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB; |
2421 | 7.11k | } |
2422 | 2.18k | return LIBRAW_INTERNAL_THUMBNAIL_JPEG; // default |
2423 | 7.11k | } |