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