Coverage Report

Created: 2025-11-11 06:13

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