Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/tiff.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2006 Konstantin Shishkov
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
21
/**
22
 * @file
23
 * TIFF image decoder
24
 * @author Konstantin Shishkov
25
 */
26
27
#include "config.h"
28
#if CONFIG_ZLIB
29
#include <zlib.h>
30
#endif
31
#if CONFIG_LZMA
32
#define LZMA_API_STATIC
33
#include <lzma.h>
34
#endif
35
36
#include <float.h>
37
38
#include "libavutil/attributes.h"
39
#include "libavutil/attributes_internal.h"
40
#include "libavutil/avstring.h"
41
#include "libavutil/error.h"
42
#include "libavutil/intreadwrite.h"
43
#include "libavutil/mem.h"
44
#include "libavutil/opt.h"
45
#include "libavutil/reverse.h"
46
#include "avcodec.h"
47
#include "bytestream.h"
48
#include "codec_internal.h"
49
#include "decode.h"
50
#include "exif_internal.h"
51
#include "faxcompr.h"
52
#include "lzw.h"
53
#include "tiff.h"
54
#include "tiff_common.h"
55
#include "tiff_data.h"
56
#include "mjpegdec.h"
57
#include "thread.h"
58
#include "get_bits.h"
59
60
typedef struct TiffContext {
61
    AVClass *class;
62
    AVCodecContext *avctx;
63
    GetByteContext gb;
64
65
    /* JPEG decoding for DNG */
66
    AVCodecContext *avctx_mjpeg; // wrapper context for MJPEG
67
    AVPacket *jpkt;              // encoded JPEG tile
68
    AVFrame *jpgframe;           // decoded JPEG tile
69
70
    int get_subimage;
71
    uint16_t get_page;
72
    int get_thumbnail;
73
74
    enum TiffType tiff_type;
75
    int width, height;
76
    unsigned int bpp, bppcount;
77
    uint32_t palette[256];
78
    int palette_is_set;
79
    int le;
80
    enum TiffCompr compr;
81
    enum TiffPhotometric photometric;
82
    int planar;
83
    int subsampling[2];
84
    int fax_opts;
85
    int predictor;
86
    int fill_order;
87
    uint32_t res[4];
88
    int is_thumbnail;
89
    unsigned last_tag;
90
91
    int is_bayer;
92
    int use_color_matrix;
93
    uint8_t pattern[4];
94
95
    float   analog_balance[4];
96
    float   as_shot_neutral[4];
97
    float   as_shot_white[4];
98
    float   color_matrix[3][4];
99
    float   camera_calibration[4][4];
100
    float   premultiply[4];
101
    float   black_level[4];
102
103
    unsigned white_level;
104
    uint16_t dng_lut[65536];
105
106
    uint32_t sub_ifd;
107
    uint16_t cur_page;
108
109
    int strips, rps, sstype;
110
    int sot;
111
    int stripsizesoff, stripsize, stripoff, strippos;
112
    LZWState *lzw;
113
114
    /* Tile support */
115
    int is_tiled;
116
    int tile_byte_counts_offset, tile_offsets_offset;
117
    int tile_width, tile_length;
118
119
    int is_jpeg;
120
121
    uint8_t *deinvert_buf;
122
    int deinvert_buf_size;
123
    uint8_t *yuv_line;
124
    unsigned int yuv_line_size;
125
126
    int geotag_count;
127
    TiffGeoTag *geotags;
128
129
    AVExifMetadata exif_meta;
130
} TiffContext;
131
132
static const float d65_white[3] = { 0.950456f, 1.f, 1.088754f };
133
134
43.7k
static void tiff_set_type(TiffContext *s, enum TiffType tiff_type) {
135
43.7k
    if (s->tiff_type < tiff_type) // Prioritize higher-valued entries
136
43.7k
        s->tiff_type = tiff_type;
137
43.7k
}
138
139
static void free_geotags(TiffContext *const s)
140
332k
{
141
767k
    for (int i = 0; i < s->geotag_count; i++)
142
435k
        av_freep(&s->geotags[i].val);
143
332k
    av_freep(&s->geotags);
144
332k
    s->geotag_count = 0;
145
332k
}
146
147
static const char *get_geokey_name(int key)
148
417k
{
149
417k
#define RET_GEOKEY_STR(TYPE, array)\
150
1.63M
    if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
151
1.63M
        key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(tiff_##array##_name_type_map))\
152
1.63M
        return tiff_##array##_name_type_string + tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].offset;
153
154
417k
    RET_GEOKEY_STR(VERT, vert);
155
411k
    RET_GEOKEY_STR(PROJ, proj);
156
407k
    RET_GEOKEY_STR(GEOG, geog);
157
399k
    RET_GEOKEY_STR(CONF, conf);
158
159
391k
    return NULL;
160
399k
}
161
162
static int get_geokey_type(int key)
163
25.4k
{
164
25.4k
#define RET_GEOKEY_TYPE(TYPE, array)\
165
68.1k
    if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
166
68.1k
        key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(tiff_##array##_name_type_map))\
167
68.1k
        return tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].type;
168
25.4k
    RET_GEOKEY_TYPE(VERT, vert);
169
19.2k
    RET_GEOKEY_TYPE(PROJ, proj);
170
15.9k
    RET_GEOKEY_TYPE(GEOG, geog);
171
7.54k
    RET_GEOKEY_TYPE(CONF, conf);
172
173
0
    return AVERROR_INVALIDDATA;
174
7.54k
}
175
176
static int cmp_id_key(const void *id, const void *k)
177
17.7k
{
178
17.7k
    return *(const int*)id - ((const TiffGeoTagKeyName*)k)->key;
179
17.7k
}
180
181
static const char *search_keyval(const TiffGeoTagKeyName *keys, int n, int id)
182
2.05k
{
183
2.05k
    const TiffGeoTagKeyName *r = bsearch(&id, keys, n, sizeof(keys[0]), cmp_id_key);
184
2.05k
    if(r)
185
376
        return r->name;
186
187
1.67k
    return NULL;
188
2.05k
}
189
190
static const char *get_geokey_val(int key, uint16_t val)
191
179k
{
192
179k
    if (val == TIFF_GEO_KEY_UNDEFINED)
193
119k
        return "undefined";
194
60.5k
    if (val == TIFF_GEO_KEY_USER_DEFINED)
195
320
        return "User-Defined";
196
197
60.2k
#define RET_GEOKEY_VAL(TYPE, array)\
198
60.2k
    if (val >= TIFF_##TYPE##_OFFSET &&\
199
23.0k
        val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(tiff_##array##_codes))\
200
23.0k
        return tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET];
201
202
60.2k
    switch (key) {
203
1.76k
    case TIFF_GT_MODEL_TYPE_GEOKEY:
204
1.76k
        RET_GEOKEY_VAL(GT_MODEL_TYPE, gt_model_type);
205
1.43k
        break;
206
4.86k
    case TIFF_GT_RASTER_TYPE_GEOKEY:
207
4.86k
        RET_GEOKEY_VAL(GT_RASTER_TYPE, gt_raster_type);
208
3.91k
        break;
209
50
    case TIFF_GEOG_LINEAR_UNITS_GEOKEY:
210
162
    case TIFF_PROJ_LINEAR_UNITS_GEOKEY:
211
827
    case TIFF_VERTICAL_UNITS_GEOKEY:
212
827
        RET_GEOKEY_VAL(LINEAR_UNIT, linear_unit);
213
720
        break;
214
1.25k
    case TIFF_GEOG_ANGULAR_UNITS_GEOKEY:
215
1.26k
    case TIFF_GEOG_AZIMUTH_UNITS_GEOKEY:
216
1.26k
        RET_GEOKEY_VAL(ANGULAR_UNIT, angular_unit);
217
1.08k
        break;
218
1.59k
    case TIFF_GEOGRAPHIC_TYPE_GEOKEY:
219
1.59k
        RET_GEOKEY_VAL(GCS_TYPE, gcs_type);
220
1.56k
        RET_GEOKEY_VAL(GCSE_TYPE, gcse_type);
221
1.55k
        break;
222
444
    case TIFF_GEOG_GEODETIC_DATUM_GEOKEY:
223
444
        RET_GEOKEY_VAL(GEODETIC_DATUM, geodetic_datum);
224
438
        RET_GEOKEY_VAL(GEODETIC_DATUM_E, geodetic_datum_e);
225
431
        break;
226
125
    case TIFF_GEOG_ELLIPSOID_GEOKEY:
227
125
        RET_GEOKEY_VAL(ELLIPSOID, ellipsoid);
228
118
        break;
229
1.38k
    case TIFF_GEOG_PRIME_MERIDIAN_GEOKEY:
230
1.38k
        RET_GEOKEY_VAL(PRIME_MERIDIAN, prime_meridian);
231
1.36k
        break;
232
1.42k
    case TIFF_PROJECTED_CS_TYPE_GEOKEY:
233
1.42k
        return search_keyval(tiff_proj_cs_type_codes, FF_ARRAY_ELEMS(tiff_proj_cs_type_codes), val);
234
633
    case TIFF_PROJECTION_GEOKEY:
235
633
        return search_keyval(tiff_projection_codes, FF_ARRAY_ELEMS(tiff_projection_codes), val);
236
32
    case TIFF_PROJ_COORD_TRANS_GEOKEY:
237
32
        RET_GEOKEY_VAL(COORD_TRANS, coord_trans);
238
13
        break;
239
4.39k
    case TIFF_VERTICAL_CS_TYPE_GEOKEY:
240
4.39k
        RET_GEOKEY_VAL(VERT_CS, vert_cs);
241
4.38k
        RET_GEOKEY_VAL(ORTHO_VERT_CS, ortho_vert_cs);
242
4.37k
        break;
243
244
60.2k
    }
245
246
56.5k
    return NULL;
247
60.2k
}
248
249
static char *doubles2str(double *dp, int count, const char *sep)
250
51
{
251
51
    int i;
252
51
    char *ap, *ap0;
253
51
    uint64_t component_len;
254
51
    if (!sep) sep = ", ";
255
51
    component_len = 24LL + strlen(sep);
256
51
    if (count >= (INT_MAX - 1)/component_len)
257
0
        return NULL;
258
51
    ap = av_malloc(component_len * count + 1);
259
51
    if (!ap)
260
0
        return NULL;
261
51
    ap0   = ap;
262
51
    ap[0] = '\0';
263
230
    for (i = 0; i < count; i++) {
264
179
        unsigned l = snprintf(ap, component_len, "%.15g%s", dp[i], sep);
265
179
        if(l >= component_len) {
266
0
            av_free(ap0);
267
0
            return NULL;
268
0
        }
269
179
        ap += l;
270
179
    }
271
51
    ap0[strlen(ap0) - strlen(sep)] = '\0';
272
51
    return ap0;
273
51
}
274
275
static int add_metadata(int count, int type,
276
                        const char *name, const char *sep, TiffContext *s, AVFrame *frame)
277
86.5k
{
278
86.5k
    switch(type) {
279
8.23k
    case AV_TIFF_DOUBLE: return ff_tadd_doubles_metadata(count, name, sep, &s->gb, s->le, &frame->metadata);
280
25.5k
    case AV_TIFF_SHORT : return ff_tadd_shorts_metadata(count, name, sep, &s->gb, s->le, 0, &frame->metadata);
281
50.9k
    case AV_TIFF_STRING: return ff_tadd_string_metadata(count, name, &s->gb, s->le, &frame->metadata);
282
1.78k
    default         : return AVERROR_INVALIDDATA;
283
86.5k
    };
284
0
}
285
286
/**
287
 * Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5)
288
 */
289
static uint16_t av_always_inline dng_process_color16(uint16_t value,
290
                                                     const uint16_t *lut,
291
                                                     float black_level,
292
                                                     float scale_factor)
293
84.1M
{
294
84.1M
    float value_norm;
295
296
    // Lookup table lookup
297
84.1M
    value = lut[value];
298
299
    // Black level subtraction
300
    // Color scaling
301
84.1M
    value_norm = ((float)value - black_level) * scale_factor;
302
303
84.1M
    value = av_clip_uint16(lrintf(value_norm));
304
305
84.1M
    return value;
306
84.1M
}
307
308
static uint16_t av_always_inline dng_process_color8(uint16_t value,
309
                                                    const uint16_t *lut,
310
                                                    float black_level,
311
                                                    float scale_factor)
312
83.2M
{
313
83.2M
    return dng_process_color16(value, lut, black_level, scale_factor) >> 8;
314
83.2M
}
315
316
static void av_always_inline dng_blit(TiffContext *s, uint8_t *dst, int dst_stride,
317
                                      const uint8_t *src, int src_stride, int width, int height,
318
                                      int is_single_comp, int is_u16, int odd_line)
319
11.1k
{
320
11.1k
    float scale_factor[4];
321
11.1k
    int line, col;
322
323
11.1k
    if (s->is_bayer) {
324
51.5k
        for (int i = 0; i < 4; i++)
325
41.2k
            scale_factor[i] = s->premultiply[s->pattern[i]] * 65535.f / (s->white_level - s->black_level[i]);
326
10.3k
    } else {
327
4.25k
        for (int i = 0; i < 4; i++)
328
3.40k
            scale_factor[i] = s->premultiply[           i ] * 65535.f / (s->white_level - s->black_level[i]);
329
850
    }
330
331
11.1k
    if (is_single_comp) {
332
807
        if (!is_u16)
333
0
            return; /* <= 8bpp unsupported */
334
335
        /* Image is double the width and half the height we need, each row comprises 2 rows of the output
336
           (split vertically in the middle). */
337
2.42k
        for (line = 0; line < height / 2; line++) {
338
1.61k
            uint16_t *dst_u16 = (uint16_t *)dst;
339
1.61k
            const uint16_t *src_u16 = (const uint16_t *)src;
340
341
            /* Blit first half of input row row to initial row of output */
342
4.84k
            for (col = 0; col < width; col++)
343
3.22k
                *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level[col&1], scale_factor[col&1]);
344
345
            /* Advance the destination pointer by a row (source pointer remains in the same place) */
346
1.61k
            dst += dst_stride * sizeof(uint16_t);
347
1.61k
            dst_u16 = (uint16_t *)dst;
348
349
            /* Blit second half of input row row to next row of output */
350
4.84k
            for (col = 0; col < width; col++)
351
3.22k
                *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level[(col&1) + 2], scale_factor[(col&1) + 2]);
352
353
1.61k
            dst += dst_stride * sizeof(uint16_t);
354
1.61k
            src += src_stride * sizeof(uint16_t);
355
1.61k
        }
356
10.3k
    } else {
357
        /* Input and output image are the same size and the MJpeg decoder has done per-component
358
           deinterleaving, so blitting here is straightforward. */
359
10.3k
        if (is_u16) {
360
201k
            for (line = 0; line < height; line++) {
361
194k
                uint16_t *dst_u16 = (uint16_t *)dst;
362
194k
                const uint16_t *src_u16 = (const uint16_t *)src;
363
364
1.09M
                for (col = 0; col < width; col++)
365
899k
                    *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut,
366
899k
                                                     s->black_level[(col&1) + 2 * ((line&1) + odd_line)],
367
899k
                                                     scale_factor[(col&1) + 2 * ((line&1) + odd_line)]);
368
369
194k
                dst += dst_stride * sizeof(uint16_t);
370
194k
                src += src_stride * sizeof(uint16_t);
371
194k
            }
372
6.45k
        } else {
373
300k
            for (line = 0; line < height; line++) {
374
296k
                uint8_t *dst_u8 = dst;
375
296k
                const uint8_t *src_u8 = src;
376
377
83.5M
                for (col = 0; col < width; col++)
378
83.2M
                    *dst_u8++ = dng_process_color8(*src_u8++, s->dng_lut,
379
83.2M
                                                   s->black_level[(col&1) + 2 * ((line&1) + odd_line)],
380
83.2M
                                                   scale_factor[(col&1) + 2 * ((line&1) + odd_line)]);
381
382
296k
                dst += dst_stride;
383
296k
                src += src_stride;
384
296k
            }
385
3.90k
        }
386
10.3k
    }
387
11.1k
}
388
389
static void av_always_inline horizontal_fill(TiffContext *s,
390
                                             unsigned int bpp, uint8_t* dst,
391
                                             int usePtr, const uint8_t *src,
392
                                             uint8_t c, int width, int offset)
393
1.73M
{
394
1.73M
    switch (bpp) {
395
1.30M
    case 1:
396
23.9M
        while (--width >= 0) {
397
22.5M
            dst[(width+offset)*8+7] = (usePtr ? src[width] : c)      & 0x1;
398
22.5M
            dst[(width+offset)*8+6] = (usePtr ? src[width] : c) >> 1 & 0x1;
399
22.5M
            dst[(width+offset)*8+5] = (usePtr ? src[width] : c) >> 2 & 0x1;
400
22.5M
            dst[(width+offset)*8+4] = (usePtr ? src[width] : c) >> 3 & 0x1;
401
22.5M
            dst[(width+offset)*8+3] = (usePtr ? src[width] : c) >> 4 & 0x1;
402
22.5M
            dst[(width+offset)*8+2] = (usePtr ? src[width] : c) >> 5 & 0x1;
403
22.5M
            dst[(width+offset)*8+1] = (usePtr ? src[width] : c) >> 6 & 0x1;
404
22.5M
            dst[(width+offset)*8+0] = (usePtr ? src[width] : c) >> 7;
405
22.5M
        }
406
1.30M
        break;
407
135k
    case 2:
408
2.70M
        while (--width >= 0) {
409
2.57M
            dst[(width+offset)*4+3] = (usePtr ? src[width] : c) & 0x3;
410
2.57M
            dst[(width+offset)*4+2] = (usePtr ? src[width] : c) >> 2 & 0x3;
411
2.57M
            dst[(width+offset)*4+1] = (usePtr ? src[width] : c) >> 4 & 0x3;
412
2.57M
            dst[(width+offset)*4+0] = (usePtr ? src[width] : c) >> 6;
413
2.57M
        }
414
135k
        break;
415
141k
    case 4:
416
3.79M
        while (--width >= 0) {
417
3.65M
            dst[(width+offset)*2+1] = (usePtr ? src[width] : c) & 0xF;
418
3.65M
            dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4;
419
3.65M
        }
420
141k
        break;
421
2.14k
    case 10:
422
3.88k
    case 12:
423
4.13k
    case 14: {
424
4.13k
            uint16_t *dst16 = (uint16_t *)dst;
425
4.13k
            int is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
426
4.13k
            uint8_t shift = is_dng ? 0 : 16 - bpp;
427
4.13k
            GetBitContext gb;
428
429
4.13k
            av_unused int ret = init_get_bits8(&gb, src, width);
430
4.13k
            av_assert1(ret >= 0);
431
40.2k
            for (int i = 0; i < s->width; i++) {
432
36.0k
                dst16[i] = get_bits(&gb, bpp) << shift;
433
36.0k
            }
434
4.13k
        }
435
4.13k
        break;
436
146k
    default:
437
146k
        if (usePtr) {
438
142k
            memcpy(dst + offset, src, width);
439
142k
        } else {
440
3.79k
            memset(dst + offset, c, width);
441
3.79k
        }
442
1.73M
    }
443
1.73M
}
444
445
static int deinvert_buffer(TiffContext *s, const uint8_t *src, int size)
446
1.17k
{
447
1.17k
    int i;
448
449
1.17k
    av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size);
450
1.17k
    if (!s->deinvert_buf)
451
0
        return AVERROR(ENOMEM);
452
4.31M
    for (i = 0; i < size; i++)
453
4.31M
        s->deinvert_buf[i] = ff_reverse[src[i]];
454
455
1.17k
    return 0;
456
1.17k
}
457
458
static void unpack_gray(TiffContext *s, AVFrame *p,
459
                       const uint8_t *src, int lnum, int width, int bpp)
460
2.03k
{
461
2.03k
    GetBitContext gb;
462
2.03k
    uint16_t *dst = (uint16_t *)(p->data[0] + lnum * p->linesize[0]);
463
464
2.03k
    av_unused int ret = init_get_bits8(&gb, src, width);
465
2.03k
    av_assert1(ret >= 0);
466
467
2.10M
    for (int i = 0; i < s->width; i++) {
468
2.09M
        dst[i] = get_bits(&gb, bpp);
469
2.09M
    }
470
2.03k
}
471
472
static void unpack_yuv(TiffContext *s, AVFrame *p,
473
                       const uint8_t *src, int lnum)
474
30.4k
{
475
30.4k
    int i, j, k;
476
30.4k
    int w       = (s->width - 1) / s->subsampling[0] + 1;
477
30.4k
    uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]];
478
30.4k
    uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]];
479
30.4k
    if (s->width % s->subsampling[0] || s->height % s->subsampling[1]) {
480
157M
        for (i = 0; i < w; i++) {
481
408M
            for (j = 0; j < s->subsampling[1]; j++)
482
809M
                for (k = 0; k < s->subsampling[0]; k++)
483
558M
                    p->data[0][FFMIN(lnum + j, s->height-1) * p->linesize[0] +
484
558M
                               FFMIN(i * s->subsampling[0] + k, s->width-1)] = *src++;
485
157M
            *pu++ = *src++;
486
157M
            *pv++ = *src++;
487
157M
        }
488
23.4k
    }else{
489
291M
        for (i = 0; i < w; i++) {
490
601M
            for (j = 0; j < s->subsampling[1]; j++)
491
620M
                for (k = 0; k < s->subsampling[0]; k++)
492
310M
                    p->data[0][(lnum + j) * p->linesize[0] +
493
310M
                               i * s->subsampling[0] + k] = *src++;
494
291M
            *pu++ = *src++;
495
291M
            *pv++ = *src++;
496
291M
        }
497
23.4k
    }
498
30.4k
}
499
500
#if CONFIG_ZLIB
501
static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
502
                           int size)
503
7.05k
{
504
7.05k
    z_stream zstream = { 0 };
505
7.05k
    int zret;
506
507
7.05k
    zstream.next_in   = src;
508
7.05k
    zstream.avail_in  = size;
509
7.05k
    zstream.next_out  = dst;
510
7.05k
    zstream.avail_out = *len;
511
7.05k
    zret              = inflateInit(&zstream);
512
7.05k
    if (zret != Z_OK) {
513
0
        av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
514
0
        return zret;
515
0
    }
516
7.05k
    zret = inflate(&zstream, Z_SYNC_FLUSH);
517
7.05k
    inflateEnd(&zstream);
518
7.05k
    *len = zstream.total_out;
519
7.05k
    return zret == Z_STREAM_END ? Z_OK : zret;
520
7.05k
}
521
522
static int tiff_unpack_zlib(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
523
                            const uint8_t *src, int size, int width, int lines,
524
                            int strip_start, int is_yuv)
525
7.05k
{
526
7.05k
    uint8_t *zbuf;
527
7.05k
    unsigned long outlen;
528
7.05k
    int ret, line;
529
7.05k
    int rows = is_yuv ? (lines + s->subsampling[1] - 1) / s->subsampling[1] : lines;
530
7.05k
    outlen = width * lines;
531
7.05k
    zbuf   = av_malloc(outlen);
532
7.05k
    if (!zbuf)
533
0
        return AVERROR(ENOMEM);
534
7.05k
    if (s->fill_order) {
535
24
        if ((ret = deinvert_buffer(s, src, size)) < 0) {
536
0
            av_free(zbuf);
537
0
            return ret;
538
0
        }
539
24
        src = s->deinvert_buf;
540
24
    }
541
7.05k
    ret = tiff_uncompress(zbuf, &outlen, src, size);
542
7.05k
    if (ret != Z_OK) {
543
1.29k
        av_log(s->avctx, AV_LOG_ERROR,
544
1.29k
               "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
545
1.29k
               (unsigned long)width * lines, ret);
546
1.29k
        av_free(zbuf);
547
1.29k
        return AVERROR_UNKNOWN;
548
1.29k
    }
549
5.76k
    if (outlen < (unsigned long)width * rows) {
550
382
        av_log(s->avctx, AV_LOG_ERROR, "Deflated %lu bytes, but %lu are needed\n",
551
382
               outlen, (unsigned long)width * rows);
552
382
        av_free(zbuf);
553
382
        return AVERROR_INVALIDDATA;
554
382
    }
555
5.38k
    src = zbuf;
556
255k
    for (line = 0; line < lines; line++) {
557
250k
        if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
558
1.19k
            horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0);
559
249k
        } else {
560
249k
            memcpy(dst, src, width);
561
249k
        }
562
250k
        if (is_yuv) {
563
9.32k
            unpack_yuv(s, p, dst, strip_start + line);
564
9.32k
            line += s->subsampling[1] - 1;
565
9.32k
        }
566
250k
        dst += stride;
567
250k
        src += width;
568
250k
    }
569
5.38k
    av_free(zbuf);
570
5.38k
    return 0;
571
5.76k
}
572
#endif
573
574
#if CONFIG_LZMA
575
static int tiff_uncompress_lzma(uint8_t *dst, uint64_t *len, const uint8_t *src,
576
                                int size)
577
{
578
    lzma_stream stream = LZMA_STREAM_INIT;
579
    lzma_ret ret;
580
581
    stream.next_in   = src;
582
    stream.avail_in  = size;
583
    stream.next_out  = dst;
584
    stream.avail_out = *len;
585
    ret              = lzma_stream_decoder(&stream, UINT64_MAX, 0);
586
    if (ret != LZMA_OK) {
587
        av_log(NULL, AV_LOG_ERROR, "LZMA init error: %d\n", ret);
588
        return ret;
589
    }
590
    ret = lzma_code(&stream, LZMA_RUN);
591
    lzma_end(&stream);
592
    *len = stream.total_out;
593
    return ret == LZMA_STREAM_END ? LZMA_OK : ret;
594
}
595
596
static int tiff_unpack_lzma(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
597
                            const uint8_t *src, int size, int width, int lines,
598
                            int strip_start, int is_yuv)
599
{
600
    uint64_t outlen = width * (uint64_t)lines;
601
    int ret, line;
602
    int rows = is_yuv ? (lines + s->subsampling[1] - 1) / s->subsampling[1] : lines;
603
    uint8_t *buf = av_malloc(outlen);
604
    if (!buf)
605
        return AVERROR(ENOMEM);
606
    if (s->fill_order) {
607
        if ((ret = deinvert_buffer(s, src, size)) < 0) {
608
            av_free(buf);
609
            return ret;
610
        }
611
        src = s->deinvert_buf;
612
    }
613
    ret = tiff_uncompress_lzma(buf, &outlen, src, size);
614
    if (ret != LZMA_OK) {
615
        av_log(s->avctx, AV_LOG_ERROR,
616
               "Uncompressing failed (%"PRIu64" of %"PRIu64") with error %d\n", outlen,
617
               (uint64_t)width * lines, ret);
618
        av_free(buf);
619
        return AVERROR_UNKNOWN;
620
    }
621
    if (outlen < (uint64_t)width * rows) {
622
        av_log(s->avctx, AV_LOG_ERROR, "Uncompressed %"PRIu64" bytes, but %"PRIu64" are needed\n",
623
               outlen, (uint64_t)width * rows);
624
        av_free(buf);
625
        return AVERROR_INVALIDDATA;
626
    }
627
    src = buf;
628
    for (line = 0; line < lines; line++) {
629
        if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
630
            horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0);
631
        } else {
632
            memcpy(dst, src, width);
633
        }
634
        if (is_yuv) {
635
            unpack_yuv(s, p, dst, strip_start + line);
636
            line += s->subsampling[1] - 1;
637
        }
638
        dst += stride;
639
        src += width;
640
    }
641
    av_free(buf);
642
    return 0;
643
}
644
#endif
645
646
static int tiff_unpack_fax(TiffContext *s, uint8_t *dst, int stride,
647
                           const uint8_t *src, int size, int width, int lines)
648
14.1k
{
649
14.1k
    int line;
650
14.1k
    int ret;
651
652
14.1k
    if (s->fill_order) {
653
913
        if ((ret = deinvert_buffer(s, src, size)) < 0)
654
0
            return ret;
655
913
        src = s->deinvert_buf;
656
913
    }
657
14.1k
    ret = ff_ccitt_unpack(s->avctx, src, size, dst, lines, stride,
658
14.1k
                          s->compr, s->fax_opts);
659
14.1k
    if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
660
1.27M
        for (line = 0; line < lines; line++) {
661
1.27M
            horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0);
662
1.27M
            dst += stride;
663
1.27M
        }
664
14.1k
    return ret;
665
14.1k
}
666
667
static int dng_decode_jpeg(AVCodecContext *avctx, AVFrame *frame,
668
                           int tile_byte_count, int dst_x, int dst_y, int w, int h)
669
33.9k
{
670
33.9k
    TiffContext *s = avctx->priv_data;
671
33.9k
    uint8_t *dst_data, *src_data;
672
33.9k
    uint32_t dst_offset; /* offset from dst buffer in pixels */
673
33.9k
    int is_single_comp, is_u16, pixel_size;
674
33.9k
    int ret;
675
676
33.9k
    if (tile_byte_count < 0 || tile_byte_count > bytestream2_get_bytes_left(&s->gb))
677
1.17k
        return AVERROR_INVALIDDATA;
678
679
    /* Prepare a packet and send to the MJPEG decoder */
680
32.7k
    av_packet_unref(s->jpkt);
681
32.7k
    s->jpkt->data = (uint8_t*)s->gb.buffer;
682
32.7k
    s->jpkt->size = tile_byte_count;
683
684
32.7k
    if (s->is_bayer) {
685
32.7k
        MJpegDecodeContext *mjpegdecctx = s->avctx_mjpeg->priv_data;
686
        /* We have to set this information here, there is no way to know if a given JPEG is a DNG-embedded
687
           image or not from its own data (and we need that information when decoding it). */
688
32.7k
        mjpegdecctx->bayer = 1;
689
32.7k
    }
690
691
32.7k
    ret = avcodec_send_packet(s->avctx_mjpeg, s->jpkt);
692
32.7k
    if (ret < 0) {
693
19.9k
        av_log(avctx, AV_LOG_ERROR, "Error submitting a packet for decoding\n");
694
19.9k
        return ret;
695
19.9k
    }
696
697
12.8k
    ret = avcodec_receive_frame(s->avctx_mjpeg, s->jpgframe);
698
12.8k
    if (ret < 0) {
699
0
        av_log(avctx, AV_LOG_ERROR, "JPEG decoding error: %s.\n", av_err2str(ret));
700
701
        /* Normally skip, error if explode */
702
0
        if (avctx->err_recognition & AV_EF_EXPLODE)
703
0
            return AVERROR_INVALIDDATA;
704
0
        else
705
0
            return 0;
706
0
    }
707
708
12.8k
    is_u16 = (s->bpp > 8);
709
710
    /* Copy the outputted tile's pixels from 'jpgframe' to 'frame' (final buffer) */
711
712
12.8k
    if (s->jpgframe->width  != s->avctx_mjpeg->width  ||
713
12.8k
        s->jpgframe->height != s->avctx_mjpeg->height ||
714
12.8k
        s->jpgframe->format != s->avctx_mjpeg->pix_fmt)
715
0
        return AVERROR_INVALIDDATA;
716
717
    /* See dng_blit for explanation */
718
12.8k
    if (s->avctx_mjpeg->width  == w * 2 &&
719
3.37k
        s->avctx_mjpeg->height == h / 2 &&
720
1.07k
        s->avctx_mjpeg->pix_fmt == AV_PIX_FMT_GRAY16LE) {
721
1.06k
        is_single_comp = 1;
722
11.8k
    } else if (s->avctx_mjpeg->width  >= w &&
723
7.94k
               s->avctx_mjpeg->height >= h &&
724
7.18k
               s->avctx_mjpeg->pix_fmt == (is_u16 ? AV_PIX_FMT_GRAY16 : AV_PIX_FMT_GRAY8)
725
11.8k
              ) {
726
5.83k
        is_single_comp = 0;
727
5.83k
    } else
728
5.97k
        return AVERROR_INVALIDDATA;
729
730
6.90k
    pixel_size = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t));
731
732
6.90k
    if (is_single_comp && !is_u16) {
733
257
        av_log(s->avctx, AV_LOG_ERROR, "DNGs with bpp <= 8 and 1 component are unsupported\n");
734
257
        av_frame_unref(s->jpgframe);
735
257
        return AVERROR_PATCHWELCOME;
736
257
    }
737
738
6.64k
    dst_offset = dst_x + frame->linesize[0] * dst_y / pixel_size;
739
6.64k
    dst_data = frame->data[0] + dst_offset * pixel_size;
740
6.64k
    src_data = s->jpgframe->data[0];
741
742
6.64k
    dng_blit(s,
743
6.64k
             dst_data,
744
6.64k
             frame->linesize[0] / pixel_size,
745
6.64k
             src_data,
746
6.64k
             s->jpgframe->linesize[0] / pixel_size,
747
6.64k
             w,
748
6.64k
             h,
749
6.64k
             is_single_comp,
750
6.64k
             is_u16, 0);
751
752
6.64k
    av_frame_unref(s->jpgframe);
753
754
6.64k
    return 0;
755
6.90k
}
756
757
static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
758
                             const uint8_t *src, int size, int strip_start, int lines)
759
98.6k
{
760
98.6k
    PutByteContext pb;
761
98.6k
    int c, line, pixels, code, ret;
762
98.6k
    const uint8_t *ssrc = src;
763
98.6k
    int width = ((s->width * s->bpp) + 7) >> 3;
764
98.6k
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(p->format);
765
98.6k
    int is_yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) &&
766
51.1k
                 (desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
767
1.90k
                 desc->nb_components >= 3;
768
98.6k
    int is_dng;
769
770
98.6k
    if (s->planar)
771
3.80k
        width /= s->bppcount;
772
773
98.6k
    if (size <= 0)
774
2.54k
        return AVERROR_INVALIDDATA;
775
776
96.1k
    if (is_yuv) {
777
1.82k
        int bytes_per_row = (((s->width - 1) / s->subsampling[0] + 1) * s->bpp *
778
1.82k
                            s->subsampling[0] * s->subsampling[1] + 7) >> 3;
779
1.82k
        av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, bytes_per_row);
780
1.82k
        if (s->yuv_line == NULL) {
781
0
            av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
782
0
            return AVERROR(ENOMEM);
783
0
        }
784
1.82k
        dst = s->yuv_line;
785
1.82k
        stride = 0;
786
787
1.82k
        width = (s->width - 1) / s->subsampling[0] + 1;
788
1.82k
        width = width * s->subsampling[0] * s->subsampling[1] + 2*width;
789
1.82k
        av_assert0(width <= bytes_per_row);
790
1.82k
        av_assert0(s->bpp == 24);
791
1.82k
    }
792
96.1k
    if (s->is_bayer) {
793
35.9k
        av_assert0(width == (s->bpp * s->width + 7) >> 3);
794
35.9k
    }
795
96.1k
    av_assert0(!(s->is_bayer && is_yuv));
796
96.1k
    if (p->format == AV_PIX_FMT_GRAY12) {
797
864
        av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, width);
798
864
        if (s->yuv_line == NULL) {
799
0
            av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
800
0
            return AVERROR(ENOMEM);
801
0
        }
802
864
        dst = s->yuv_line;
803
864
        stride = 0;
804
864
    }
805
806
96.1k
    if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
807
7.05k
#if CONFIG_ZLIB
808
7.05k
        return tiff_unpack_zlib(s, p, dst, stride, src, size, width, lines,
809
7.05k
                                strip_start, is_yuv);
810
#else
811
        av_log(s->avctx, AV_LOG_ERROR,
812
               "zlib support not enabled, "
813
               "deflate compression not supported\n");
814
        return AVERROR(ENOSYS);
815
#endif
816
7.05k
    }
817
89.0k
    if (s->compr == TIFF_LZMA) {
818
#if CONFIG_LZMA
819
        return tiff_unpack_lzma(s, p, dst, stride, src, size, width, lines,
820
                                strip_start, is_yuv);
821
#else
822
0
        av_log(s->avctx, AV_LOG_ERROR,
823
0
               "LZMA support not enabled\n");
824
0
        return AVERROR(ENOSYS);
825
0
#endif
826
0
    }
827
89.0k
    if (s->compr == TIFF_LZW) {
828
3.78k
        if (s->fill_order) {
829
237
            if ((ret = deinvert_buffer(s, src, size)) < 0)
830
0
                return ret;
831
237
            ssrc = src = s->deinvert_buf;
832
237
        }
833
3.78k
        if (size > 1 && !src[0] && (src[1]&1)) {
834
676
            av_log(s->avctx, AV_LOG_ERROR, "Old style LZW is unsupported\n");
835
676
        }
836
3.78k
        if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) {
837
0
            av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
838
0
            return ret;
839
0
        }
840
13.1k
        for (line = 0; line < lines; line++) {
841
11.0k
            pixels = ff_lzw_decode(s->lzw, dst, width);
842
11.0k
            if (pixels < width) {
843
1.69k
                av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n",
844
1.69k
                       pixels, width);
845
1.69k
                return AVERROR_INVALIDDATA;
846
1.69k
            }
847
9.33k
            if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
848
4.38k
                horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0);
849
9.33k
            if (is_yuv) {
850
81
                unpack_yuv(s, p, dst, strip_start + line);
851
81
                line += s->subsampling[1] - 1;
852
9.25k
            } else if (p->format == AV_PIX_FMT_GRAY12) {
853
372
                unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
854
372
            }
855
9.33k
            dst += stride;
856
9.33k
        }
857
2.09k
        return 0;
858
3.78k
    }
859
85.2k
    if (s->compr == TIFF_CCITT_RLE ||
860
80.1k
        s->compr == TIFF_G3        ||
861
75.0k
        s->compr == TIFF_G4) {
862
14.1k
        if (is_yuv || p->format == AV_PIX_FMT_GRAY12)
863
74
            return AVERROR_INVALIDDATA;
864
865
14.1k
        return tiff_unpack_fax(s, dst, stride, src, size, width, lines);
866
14.1k
    }
867
868
71.0k
    bytestream2_init(&s->gb, src, size);
869
71.0k
    bytestream2_init_writer(&pb, dst, is_yuv ? s->yuv_line_size : (stride * lines));
870
871
71.0k
    is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
872
873
    /* Decode JPEG-encoded DNGs with strips */
874
71.0k
    if (s->compr == TIFF_NEWJPEG && is_dng) {
875
32.3k
        if (s->strips > 1) {
876
315
            av_log(s->avctx, AV_LOG_ERROR, "More than one DNG JPEG strips unsupported\n");
877
315
            return AVERROR_PATCHWELCOME;
878
315
        }
879
31.9k
        if (!s->is_bayer)
880
324
            return AVERROR_PATCHWELCOME;
881
31.6k
        if ((ret = dng_decode_jpeg(s->avctx, p, s->stripsize, 0, 0, s->width, s->height)) < 0)
882
25.6k
            return ret;
883
6.02k
        return 0;
884
31.6k
    }
885
886
38.7k
    if (is_dng && stride == 0)
887
224
        return AVERROR_INVALIDDATA;
888
889
1.03M
    for (line = 0; line < lines; line++) {
890
1.01M
        if (src - ssrc > size) {
891
0
            av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
892
0
            return AVERROR_INVALIDDATA;
893
0
        }
894
895
1.01M
        if (bytestream2_get_bytes_left(&s->gb) == 0 || bytestream2_get_eof(&pb))
896
0
            break;
897
1.01M
        bytestream2_seek_p(&pb, stride * line, SEEK_SET);
898
1.01M
        switch (s->compr) {
899
280k
        case TIFF_RAW:
900
280k
            if (ssrc + size - src < width)
901
18.6k
                return AVERROR_INVALIDDATA;
902
903
262k
            if (!s->fill_order) {
904
260k
                horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 || s->is_bayer),
905
260k
                                dst, 1, src, 0, width, 0);
906
260k
            } else {
907
1.81k
                int i;
908
9.97k
                for (i = 0; i < width; i++)
909
8.16k
                    dst[i] = ff_reverse[src[i]];
910
1.81k
            }
911
912
            /* Color processing for DNG images with uncompressed strips (non-tiled) */
913
262k
            if (is_dng) {
914
4.52k
                int is_u16, pixel_size_bytes, pixel_size_bits, elements;
915
916
4.52k
                is_u16 = (s->bpp / s->bppcount > 8);
917
4.52k
                pixel_size_bits = (is_u16 ? 16 : 8);
918
4.52k
                pixel_size_bytes = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t));
919
920
4.52k
                elements = width / pixel_size_bytes * pixel_size_bits / s->bpp * s->bppcount; // need to account for [1, 16] bpp
921
4.52k
                av_assert0 (elements * pixel_size_bytes <= FFABS(stride));
922
4.52k
                dng_blit(s,
923
4.52k
                         dst,
924
4.52k
                         0, // no stride, only 1 line
925
4.52k
                         dst,
926
4.52k
                         0, // no stride, only 1 line
927
4.52k
                         elements,
928
4.52k
                         1,
929
4.52k
                         0, // single-component variation is only preset in JPEG-encoded DNGs
930
4.52k
                         is_u16,
931
4.52k
                         (line + strip_start)&1);
932
4.52k
            }
933
934
262k
            src += width;
935
262k
            break;
936
2.37k
        case TIFF_PACKBITS:
937
193k
            for (pixels = 0; pixels < width;) {
938
192k
                if (ssrc + size - src < 2) {
939
390
                    av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
940
390
                    return AVERROR_INVALIDDATA;
941
390
                }
942
192k
                code = s->fill_order ? (int8_t) ff_reverse[*src++]: (int8_t) *src++;
943
192k
                if (code >= 0) {
944
174k
                    code++;
945
174k
                    if (pixels + code > width ||
946
173k
                        ssrc + size - src < code) {
947
908
                        av_log(s->avctx, AV_LOG_ERROR,
948
908
                               "Copy went out of bounds\n");
949
908
                        return AVERROR_INVALIDDATA;
950
908
                    }
951
173k
                    horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
952
173k
                                    dst, 1, src, 0, code, pixels);
953
173k
                    src    += code;
954
173k
                    pixels += code;
955
173k
                } else if (code != -128) { // -127..-1
956
17.2k
                    code = (-code) + 1;
957
17.2k
                    if (pixels + code > width) {
958
253
                        av_log(s->avctx, AV_LOG_ERROR,
959
253
                               "Run went out of bounds\n");
960
253
                        return AVERROR_INVALIDDATA;
961
253
                    }
962
17.0k
                    c = *src++;
963
17.0k
                    horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
964
17.0k
                                    dst, 0, NULL, c, code, pixels);
965
17.0k
                    pixels += code;
966
17.0k
                }
967
192k
            }
968
825
            if (s->fill_order) {
969
292
                int i;
970
6.60k
                for (i = 0; i < width; i++)
971
6.31k
                    dst[i] = ff_reverse[dst[i]];
972
292
            }
973
825
            break;
974
1.01M
        }
975
997k
        if (is_yuv) {
976
21.0k
            unpack_yuv(s, p, dst, strip_start + line);
977
21.0k
            line += s->subsampling[1] - 1;
978
976k
        } else if (p->format == AV_PIX_FMT_GRAY12) {
979
1.66k
            unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
980
1.66k
        }
981
997k
        dst += stride;
982
997k
    }
983
18.3k
    return 0;
984
38.5k
}
985
986
static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame,
987
                            const AVPacket *avpkt)
988
2.36k
{
989
2.36k
    TiffContext *s = avctx->priv_data;
990
2.36k
    int tile_idx;
991
2.36k
    int tile_offset_offset, tile_offset;
992
2.36k
    int tile_byte_count_offset, tile_byte_count;
993
2.36k
    int tile_count_x, tile_count_y;
994
2.36k
    int tile_width, tile_length;
995
2.36k
    int has_width_leftover, has_height_leftover;
996
2.36k
    int tile_x = 0, tile_y = 0;
997
2.36k
    int pos_x = 0, pos_y = 0;
998
2.36k
    int ret;
999
1000
2.36k
    if (s->tile_width <= 0 || s->tile_length <= 0)
1001
483
        return AVERROR_INVALIDDATA;
1002
1003
1.87k
    has_width_leftover = (s->width % s->tile_width != 0);
1004
1.87k
    has_height_leftover = (s->height % s->tile_length != 0);
1005
1006
    /* Calculate tile counts (round up) */
1007
1.87k
    tile_count_x = (s->width - 1) / s->tile_width + 1;
1008
1.87k
    tile_count_y = (s->height - 1) / s->tile_length + 1;
1009
1010
    /* Iterate over the number of tiles */
1011
2.49k
    for (tile_idx = 0; tile_idx < tile_count_x * tile_count_y; tile_idx++) {
1012
2.29k
        tile_x = tile_idx % tile_count_x;
1013
2.29k
        tile_y = tile_idx / tile_count_x;
1014
1015
2.29k
        if (has_width_leftover && tile_x == tile_count_x - 1) // If on the right-most tile
1016
900
            tile_width = s->width % s->tile_width;
1017
1.39k
        else
1018
1.39k
            tile_width = s->tile_width;
1019
1020
2.29k
        if (has_height_leftover && tile_y == tile_count_y - 1) // If on the bottom-most tile
1021
652
            tile_length = s->height % s->tile_length;
1022
1.64k
        else
1023
1.64k
            tile_length = s->tile_length;
1024
1025
        /* Read tile offset */
1026
2.29k
        tile_offset_offset = s->tile_offsets_offset + tile_idx * sizeof(int);
1027
2.29k
        bytestream2_seek(&s->gb, tile_offset_offset, SEEK_SET);
1028
2.29k
        tile_offset = ff_tget_long(&s->gb, s->le);
1029
1030
        /* Read tile byte size */
1031
2.29k
        tile_byte_count_offset = s->tile_byte_counts_offset + tile_idx * sizeof(int);
1032
2.29k
        bytestream2_seek(&s->gb, tile_byte_count_offset, SEEK_SET);
1033
2.29k
        tile_byte_count = ff_tget_long(&s->gb, s->le);
1034
1035
        /* Seek to tile data */
1036
2.29k
        bytestream2_seek(&s->gb, tile_offset, SEEK_SET);
1037
1038
        /* Decode JPEG tile and copy it in the reference frame */
1039
2.29k
        ret = dng_decode_jpeg(avctx, frame, tile_byte_count, pos_x, pos_y, tile_width, tile_length);
1040
1041
2.29k
        if (ret < 0)
1042
1.67k
            return ret;
1043
1044
        /* Advance current positions */
1045
616
        pos_x += tile_width;
1046
616
        if (tile_x == tile_count_x - 1) { // If on the right edge
1047
202
            pos_x = 0;
1048
202
            pos_y += tile_length;
1049
202
        }
1050
616
    }
1051
1052
    /* Frame is ready to be output */
1053
202
    frame->pict_type = AV_PICTURE_TYPE_I;
1054
202
    frame->flags |= AV_FRAME_FLAG_KEY;
1055
1056
202
    return avpkt->size;
1057
1.87k
}
1058
1059
static int init_image(TiffContext *s, AVFrame *frame)
1060
181k
{
1061
181k
    int ret;
1062
181k
    int create_gray_palette = 0;
1063
1064
    // make sure there is no aliasing in the following switch
1065
181k
    if (s->bpp > 128 || s->bppcount >= 10) {
1066
0
        av_log(s->avctx, AV_LOG_ERROR,
1067
0
               "Unsupported image parameters: bpp=%d, bppcount=%d\n",
1068
0
               s->bpp, s->bppcount);
1069
0
        return AVERROR_INVALIDDATA;
1070
0
    }
1071
1072
181k
    switch (s->planar * 10000 + s->bpp * 10 + s->bppcount + s->is_bayer * 100000) {
1073
118k
    case 11:
1074
118k
        if (!s->palette_is_set) {
1075
85.4k
            s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
1076
85.4k
            break;
1077
85.4k
        }
1078
33.4k
        av_fallthrough;
1079
33.9k
    case 21:
1080
35.1k
    case 41:
1081
35.1k
        s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
1082
35.1k
        if (!s->palette_is_set) {
1083
1.30k
            create_gray_palette = 1;
1084
1.30k
        }
1085
35.1k
        break;
1086
1.81k
    case 81:
1087
1.81k
        s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
1088
1.81k
        break;
1089
1.03k
    case 121:
1090
1.03k
        s->avctx->pix_fmt = AV_PIX_FMT_GRAY12;
1091
1.03k
        break;
1092
5.49k
    case 100081:
1093
5.49k
        switch (AV_RL32(s->pattern)) {
1094
827
        case 0x02010100:
1095
827
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB8;
1096
827
            break;
1097
3.63k
        case 0x00010102:
1098
3.63k
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR8;
1099
3.63k
            break;
1100
414
        case 0x01000201:
1101
414
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG8;
1102
414
            break;
1103
377
        case 0x01020001:
1104
377
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG8;
1105
377
            break;
1106
240
        default:
1107
240
            av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n",
1108
240
                   AV_RL32(s->pattern));
1109
240
            return AVERROR_PATCHWELCOME;
1110
5.49k
        }
1111
5.25k
        break;
1112
34.9k
    case 100101:
1113
35.2k
    case 100121:
1114
35.5k
    case 100141:
1115
36.3k
    case 100161:
1116
36.3k
        switch (AV_RL32(s->pattern)) {
1117
2.22k
        case 0x02010100:
1118
2.22k
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB16;
1119
2.22k
            break;
1120
32.9k
        case 0x00010102:
1121
32.9k
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR16;
1122
32.9k
            break;
1123
335
        case 0x01000201:
1124
335
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG16;
1125
335
            break;
1126
473
        case 0x01020001:
1127
473
            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG16;
1128
473
            break;
1129
378
        default:
1130
378
            av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n",
1131
378
                   AV_RL32(s->pattern));
1132
378
            return AVERROR_PATCHWELCOME;
1133
36.3k
        }
1134
35.9k
        break;
1135
35.9k
    case 243:
1136
3.38k
        if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
1137
2.52k
            if (s->subsampling[0] == 1 && s->subsampling[1] == 1) {
1138
813
                s->avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1139
1.71k
            } else if (s->subsampling[0] == 2 && s->subsampling[1] == 1) {
1140
80
                s->avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1141
1.63k
            } else if (s->subsampling[0] == 4 && s->subsampling[1] == 1) {
1142
335
                s->avctx->pix_fmt = AV_PIX_FMT_YUV411P;
1143
1.29k
            } else if (s->subsampling[0] == 1 && s->subsampling[1] == 2) {
1144
415
                s->avctx->pix_fmt = AV_PIX_FMT_YUV440P;
1145
884
            } else if (s->subsampling[0] == 2 && s->subsampling[1] == 2) {
1146
483
                s->avctx->pix_fmt = AV_PIX_FMT_YUV420P;
1147
483
            } else if (s->subsampling[0] == 4 && s->subsampling[1] == 4) {
1148
1
                s->avctx->pix_fmt = AV_PIX_FMT_YUV410P;
1149
400
            } else {
1150
400
                av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr subsampling\n");
1151
400
                return AVERROR_PATCHWELCOME;
1152
400
            }
1153
2.52k
        } else
1154
857
            s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
1155
2.98k
        break;
1156
2.98k
    case 161:
1157
2.59k
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GRAY16LE : AV_PIX_FMT_GRAY16BE;
1158
2.59k
        break;
1159
354
    case 162:
1160
354
        s->avctx->pix_fmt = AV_PIX_FMT_YA8;
1161
354
        break;
1162
1.28k
    case 322:
1163
1.28k
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_YA16LE : AV_PIX_FMT_YA16BE;
1164
1.28k
        break;
1165
668
    case 324:
1166
668
        s->avctx->pix_fmt = s->photometric == TIFF_PHOTOMETRIC_SEPARATED ? AV_PIX_FMT_RGB0 : AV_PIX_FMT_RGBA;
1167
668
        break;
1168
12
    case 405:
1169
12
        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED)
1170
11
            s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
1171
1
        else {
1172
1
            av_log(s->avctx, AV_LOG_ERROR,
1173
1
                "bpp=40 without PHOTOMETRIC_SEPARATED is unsupported\n");
1174
1
            return AVERROR_PATCHWELCOME;
1175
1
        }
1176
11
        break;
1177
598
    case 483:
1178
598
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE  : AV_PIX_FMT_RGB48BE;
1179
598
        break;
1180
284
    case 644:
1181
284
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBA64LE  : AV_PIX_FMT_RGBA64BE;
1182
284
        break;
1183
737
    case 10243:
1184
737
        s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
1185
737
        break;
1186
216
    case 10324:
1187
216
        s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
1188
216
        break;
1189
302
    case 10483:
1190
302
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRP16LE : AV_PIX_FMT_GBRP16BE;
1191
302
        break;
1192
401
    case 10644:
1193
401
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRAP16LE : AV_PIX_FMT_GBRAP16BE;
1194
401
        break;
1195
3
    case 963:
1196
3
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBF32LE : AV_PIX_FMT_RGBF32BE;
1197
3
        break;
1198
6
    case 1284:
1199
6
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBAF32LE : AV_PIX_FMT_RGBAF32BE;
1200
6
        break;
1201
1
    case 10963:
1202
1
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRPF32LE : AV_PIX_FMT_GBRPF32BE;
1203
1
        break;
1204
1
    case 11284:
1205
1
        s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRAPF32LE : AV_PIX_FMT_GBRAPF32BE;
1206
1
        break;
1207
5.59k
    default:
1208
5.59k
        av_log(s->avctx, AV_LOG_ERROR,
1209
5.59k
               "This format is not supported (bpp=%d, bppcount=%d)\n",
1210
5.59k
               s->bpp, s->bppcount);
1211
5.59k
        return AVERROR_INVALIDDATA;
1212
181k
    }
1213
1214
175k
    if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
1215
12.8k
        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1216
12.8k
        if((desc->flags & AV_PIX_FMT_FLAG_RGB) ||
1217
12.7k
           !(desc->flags & AV_PIX_FMT_FLAG_PLANAR) ||
1218
10.7k
           desc->nb_components < 3) {
1219
10.7k
            av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr variant\n");
1220
10.7k
            return AVERROR_INVALIDDATA;
1221
10.7k
        }
1222
12.8k
    }
1223
1224
164k
    if (s->width != s->avctx->width || s->height != s->avctx->height) {
1225
33.9k
        ret = ff_set_dimensions(s->avctx, s->width, s->height);
1226
33.9k
        if (ret < 0)
1227
11.3k
            return ret;
1228
33.9k
    }
1229
1230
153k
    if (s->avctx->skip_frame >= AVDISCARD_ALL)
1231
3.72k
        return 0;
1232
1233
149k
    if ((ret = ff_thread_get_buffer(s->avctx, frame, 0)) < 0)
1234
4.12k
        return ret;
1235
145k
    if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
1236
29.8k
        if (!create_gray_palette)
1237
28.8k
            memcpy(frame->data[1], s->palette, sizeof(s->palette));
1238
973
        else {
1239
            /* make default grayscale pal */
1240
973
            int i;
1241
973
            uint32_t *pal = (uint32_t *)frame->data[1];
1242
13.7k
            for (i = 0; i < 1<<s->bpp; i++)
1243
12.7k
                pal[i] = 0xFFU << 24 | i * 255 / ((1<<s->bpp) - 1) * 0x010101;
1244
973
        }
1245
29.8k
    }
1246
145k
    return 1;
1247
149k
}
1248
1249
static void set_sar(TiffContext *s, unsigned tag, unsigned numerator, unsigned denumerator)
1250
19.2k
{
1251
19.2k
    int offset = tag == TIFF_YRES ? 2 : 0;
1252
19.2k
    s->res[offset++] = numerator;
1253
19.2k
    s->res[offset]   = denumerator;
1254
19.2k
    if (s->res[0] && s->res[1] && s->res[2] && s->res[3]) {
1255
9.44k
        uint64_t num = s->res[2] * (uint64_t)s->res[1];
1256
9.44k
        uint64_t den = s->res[0] * (uint64_t)s->res[3];
1257
9.44k
        if (num > INT64_MAX || den > INT64_MAX) {
1258
4.02k
            num = num >> 1;
1259
4.02k
            den = den >> 1;
1260
4.02k
        }
1261
9.44k
        av_reduce(&s->avctx->sample_aspect_ratio.num, &s->avctx->sample_aspect_ratio.den,
1262
9.44k
                  num, den, INT32_MAX);
1263
9.44k
        if (!s->avctx->sample_aspect_ratio.den)
1264
197
            s->avctx->sample_aspect_ratio = (AVRational) {0, 1};
1265
9.44k
    }
1266
19.2k
}
1267
1268
static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
1269
3.27M
{
1270
3.27M
    AVFrameSideData *sd;
1271
3.27M
    GetByteContext gb_temp;
1272
3.27M
    unsigned tag, type, count, off, value = 0, value2 = 1; // value2 is a denominator so init. to 1
1273
3.27M
    int start;
1274
3.27M
    int pos;
1275
3.27M
    int ret;
1276
3.27M
    double *dp;
1277
1278
3.27M
    ret = ff_tread_tag(&s->gb, s->le, &tag, &type, &count, &start);
1279
3.27M
    if (ret < 0) {
1280
2.38M
        goto end;
1281
2.38M
    }
1282
895k
    if (tag <= s->last_tag)
1283
19.7k
        return AVERROR_INVALIDDATA;
1284
1285
    // We ignore TIFF_STRIP_SIZE as it is sometimes in the logic but wrong order around TIFF_STRIP_OFFS
1286
875k
    if (tag != TIFF_STRIP_SIZE)
1287
864k
        s->last_tag = tag;
1288
1289
875k
    off = bytestream2_tell(&s->gb);
1290
875k
    if (count == 1) {
1291
535k
        switch (type) {
1292
35.7k
        case AV_TIFF_BYTE:
1293
436k
        case AV_TIFF_SHORT:
1294
505k
        case AV_TIFF_LONG:
1295
505k
            value = ff_tget(&s->gb, type, s->le);
1296
505k
            break;
1297
24.6k
        case AV_TIFF_RATIONAL:
1298
24.6k
            value  = ff_tget_long(&s->gb, s->le);
1299
24.6k
            value2 = ff_tget_long(&s->gb, s->le);
1300
24.6k
            if (!value2) {
1301
10.5k
                av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator in rational\n");
1302
10.5k
                value2 = 1;
1303
10.5k
            }
1304
1305
24.6k
            break;
1306
490
        case AV_TIFF_STRING:
1307
490
            if (count <= 4) {
1308
490
                break;
1309
490
            }
1310
0
            av_fallthrough;
1311
4.64k
        default:
1312
4.64k
            value = UINT_MAX;
1313
535k
        }
1314
535k
    }
1315
1316
875k
    switch (tag) {
1317
10.8k
    case TIFF_SUBFILE:
1318
10.8k
        s->is_thumbnail = (value != 0);
1319
10.8k
        break;
1320
87.7k
    case TIFF_WIDTH:
1321
87.7k
        if (value > INT_MAX)
1322
508
            return AVERROR_INVALIDDATA;
1323
87.2k
        s->width = value;
1324
87.2k
        break;
1325
85.2k
    case TIFF_HEIGHT:
1326
85.2k
        if (value > INT_MAX)
1327
326
            return AVERROR_INVALIDDATA;
1328
84.9k
        s->height = value;
1329
84.9k
        break;
1330
74.4k
    case TIFF_BPP:
1331
74.4k
        if (count > 5 || count <= 0) {
1332
948
            av_log(s->avctx, AV_LOG_ERROR,
1333
948
                   "This format is not supported (bpp=%d, %d components)\n",
1334
948
                   value, count);
1335
948
            return AVERROR_INVALIDDATA;
1336
948
        }
1337
73.4k
        s->bppcount = count;
1338
73.4k
        if (count == 1)
1339
64.7k
            s->bpp = value;
1340
8.75k
        else {
1341
8.75k
            switch (type) {
1342
591
            case AV_TIFF_BYTE:
1343
8.24k
            case AV_TIFF_SHORT:
1344
8.47k
            case AV_TIFF_LONG:
1345
8.47k
                s->bpp = 0;
1346
8.47k
                if (bytestream2_get_bytes_left(&s->gb) < type_sizes[type] * count)
1347
817
                    return AVERROR_INVALIDDATA;
1348
29.4k
                for (int i = 0; i < count; i++)
1349
21.8k
                    s->bpp += ff_tget(&s->gb, type, s->le);
1350
7.65k
                break;
1351
280
            default:
1352
280
                s->bpp = -1;
1353
8.75k
            }
1354
8.75k
        }
1355
72.6k
        break;
1356
72.6k
    case TIFF_SAMPLES_PER_PIXEL:
1357
12.8k
        if (count != 1) {
1358
450
            av_log(s->avctx, AV_LOG_ERROR,
1359
450
                   "Samples per pixel requires a single value, many provided\n");
1360
450
            return AVERROR_INVALIDDATA;
1361
450
        }
1362
12.3k
        if (value > 5 || value <= 0) {
1363
532
            av_log(s->avctx, AV_LOG_ERROR,
1364
532
                   "Invalid samples per pixel %d\n", value);
1365
532
            return AVERROR_INVALIDDATA;
1366
532
        }
1367
11.8k
        if (s->bppcount == 1)
1368
9.59k
            s->bpp *= value;
1369
11.8k
        s->bppcount = value;
1370
11.8k
        break;
1371
94.8k
    case TIFF_COMPR:
1372
94.8k
        s->compr     = value;
1373
94.8k
        av_log(s->avctx, AV_LOG_DEBUG, "compression: %d\n", s->compr);
1374
94.8k
        s->predictor = 0;
1375
94.8k
        switch (s->compr) {
1376
7.36k
        case TIFF_RAW:
1377
10.0k
        case TIFF_PACKBITS:
1378
25.6k
        case TIFF_LZW:
1379
28.3k
        case TIFF_CCITT_RLE:
1380
28.3k
            break;
1381
1.99k
        case TIFF_G3:
1382
8.27k
        case TIFF_G4:
1383
8.27k
            s->fax_opts = 0;
1384
8.27k
            break;
1385
265
        case TIFF_DEFLATE:
1386
3.03k
        case TIFF_ADOBE_DEFLATE:
1387
3.03k
#if CONFIG_ZLIB
1388
3.03k
            break;
1389
#else
1390
            av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
1391
            return AVERROR(ENOSYS);
1392
#endif
1393
366
        case TIFF_JPEG:
1394
52.8k
        case TIFF_NEWJPEG:
1395
52.8k
            s->is_jpeg = 1;
1396
52.8k
            break;
1397
205
        case TIFF_LZMA:
1398
#if CONFIG_LZMA
1399
            break;
1400
#else
1401
205
            av_log(s->avctx, AV_LOG_ERROR, "LZMA not compiled in\n");
1402
205
            return AVERROR(ENOSYS);
1403
0
#endif
1404
2.08k
        default:
1405
2.08k
            av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
1406
2.08k
                   s->compr);
1407
2.08k
            return AVERROR_INVALIDDATA;
1408
94.8k
        }
1409
92.5k
        break;
1410
92.5k
    case TIFF_ROWSPERSTRIP:
1411
10.4k
        if (!value || (type == AV_TIFF_LONG && value == UINT_MAX))
1412
2.42k
            value = s->height;
1413
10.4k
        s->rps = FFMIN(value, s->height);
1414
10.4k
        break;
1415
48.4k
    case TIFF_STRIP_OFFS:
1416
48.4k
        if (count == 1) {
1417
37.6k
            if (value > INT_MAX) {
1418
888
                av_log(s->avctx, AV_LOG_ERROR,
1419
888
                    "strippos %u too large\n", value);
1420
888
                return AVERROR_INVALIDDATA;
1421
888
            }
1422
36.7k
            s->strippos = 0;
1423
36.7k
            s->stripoff = value;
1424
36.7k
        } else
1425
10.7k
            s->strippos = off;
1426
47.5k
        s->strips = count;
1427
47.5k
        if (s->strips == s->bppcount)
1428
35.9k
            s->rps = s->height;
1429
47.5k
        s->sot = type;
1430
47.5k
        break;
1431
10.8k
    case TIFF_STRIP_SIZE:
1432
10.8k
        if (count == 1) {
1433
8.00k
            if (value > INT_MAX) {
1434
644
                av_log(s->avctx, AV_LOG_ERROR,
1435
644
                    "stripsize %u too large\n", value);
1436
644
                return AVERROR_INVALIDDATA;
1437
644
            }
1438
7.35k
            s->stripsizesoff = 0;
1439
7.35k
            s->stripsize     = value;
1440
7.35k
            s->strips        = 1;
1441
7.35k
        } else {
1442
2.87k
            s->stripsizesoff = off;
1443
2.87k
        }
1444
10.2k
        s->strips = count;
1445
10.2k
        s->sstype = type;
1446
10.2k
        break;
1447
8.63k
    case TIFF_XRES:
1448
19.2k
    case TIFF_YRES:
1449
19.2k
        set_sar(s, tag, value, value2);
1450
19.2k
        break;
1451
4.99k
    case TIFF_TILE_OFFSETS:
1452
4.99k
        s->tile_offsets_offset = off;
1453
4.99k
        s->is_tiled = 1;
1454
4.99k
        break;
1455
1.53k
    case TIFF_TILE_BYTE_COUNTS:
1456
1.53k
        s->tile_byte_counts_offset = off;
1457
1.53k
        break;
1458
1.89k
    case TIFF_TILE_LENGTH:
1459
1.89k
        if (value > INT_MAX)
1460
335
            return AVERROR_INVALIDDATA;
1461
1.56k
        s->tile_length = value;
1462
1.56k
        break;
1463
4.65k
    case TIFF_TILE_WIDTH:
1464
4.65k
        if (value > INT_MAX)
1465
231
            return AVERROR_INVALIDDATA;
1466
4.42k
        s->tile_width = value;
1467
4.42k
        break;
1468
5.39k
    case TIFF_PREDICTOR:
1469
5.39k
        if (value > INT_MAX)
1470
258
            return AVERROR_INVALIDDATA;
1471
5.13k
        s->predictor = value;
1472
5.13k
        break;
1473
3.80k
    case TIFF_SUB_IFDS:
1474
3.80k
        if (count == 1)
1475
208
            s->sub_ifd = value;
1476
3.59k
        else if (count > 1)
1477
3.37k
            s->sub_ifd = ff_tget_long(&s->gb, s->le); /** Only get the first SubIFD */
1478
3.80k
        break;
1479
2.09k
    case TIFF_GRAY_RESPONSE_CURVE:
1480
2.87k
    case DNG_LINEARIZATION_TABLE:
1481
2.87k
        if (count < 1 || count > FF_ARRAY_ELEMS(s->dng_lut))
1482
1.01k
            return AVERROR_INVALIDDATA;
1483
2.74M
        for (int i = 0; i < count; i++)
1484
2.74M
            s->dng_lut[i] = ff_tget(&s->gb, type, s->le);
1485
1.86k
        s->white_level = s->dng_lut[count-1];
1486
1.86k
        break;
1487
3.40k
    case DNG_BLACK_LEVEL:
1488
3.40k
        if (count > FF_ARRAY_ELEMS(s->black_level))
1489
1.12k
            return AVERROR_INVALIDDATA;
1490
2.28k
        s->black_level[0] = value / (float)value2;
1491
8.73k
        for (int i = 0; i < count && count > 1; i++) {
1492
6.44k
            if (type == AV_TIFF_RATIONAL) {
1493
4.82k
                value  = ff_tget_long(&s->gb, s->le);
1494
4.82k
                value2 = ff_tget_long(&s->gb, s->le);
1495
4.82k
                if (!value2) {
1496
2.18k
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1497
2.18k
                    value2 = 1;
1498
2.18k
                }
1499
1500
4.82k
                s->black_level[i] = value / (float)value2;
1501
4.82k
            } else if (type == AV_TIFF_SRATIONAL) {
1502
718
                int val  = ff_tget_long(&s->gb, s->le);
1503
718
                int val2 = ff_tget_long(&s->gb, s->le);
1504
718
                if (!val2) {
1505
310
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1506
310
                    val2 = 1;
1507
310
                }
1508
1509
718
                s->black_level[i] = val / (float)val2;
1510
904
            } else {
1511
904
                s->black_level[i] = ff_tget(&s->gb, type, s->le);
1512
904
            }
1513
6.44k
        }
1514
4.37k
        for (int i = count; i < 4 && count > 0; i++)
1515
2.09k
            s->black_level[i] = s->black_level[count - 1];
1516
2.28k
        break;
1517
333
    case DNG_WHITE_LEVEL:
1518
333
        s->white_level = value;
1519
333
        break;
1520
5.33k
    case TIFF_CFA_PATTERN_DIM:
1521
5.33k
        if (count != 2 || (ff_tget(&s->gb, type, s->le) != 2 &&
1522
2.02k
                           ff_tget(&s->gb, type, s->le) != 2)) {
1523
2.02k
            av_log(s->avctx, AV_LOG_ERROR, "CFA Pattern dimensions are not 2x2\n");
1524
2.02k
            return AVERROR_INVALIDDATA;
1525
2.02k
        }
1526
3.31k
        break;
1527
46.2k
    case TIFF_CFA_PATTERN:
1528
46.2k
        s->is_bayer = 1;
1529
46.2k
        s->pattern[0] = ff_tget(&s->gb, type, s->le);
1530
46.2k
        s->pattern[1] = ff_tget(&s->gb, type, s->le);
1531
46.2k
        s->pattern[2] = ff_tget(&s->gb, type, s->le);
1532
46.2k
        s->pattern[3] = ff_tget(&s->gb, type, s->le);
1533
46.2k
        break;
1534
39.3k
    case TIFF_PHOTOMETRIC:
1535
39.3k
        switch (value) {
1536
6.76k
        case TIFF_PHOTOMETRIC_WHITE_IS_ZERO:
1537
7.63k
        case TIFF_PHOTOMETRIC_BLACK_IS_ZERO:
1538
14.1k
        case TIFF_PHOTOMETRIC_RGB:
1539
14.6k
        case TIFF_PHOTOMETRIC_PALETTE:
1540
18.9k
        case TIFF_PHOTOMETRIC_SEPARATED:
1541
36.4k
        case TIFF_PHOTOMETRIC_YCBCR:
1542
36.7k
        case TIFF_PHOTOMETRIC_CFA:
1543
37.4k
        case TIFF_PHOTOMETRIC_LINEAR_RAW: // Used by DNG images
1544
37.4k
            s->photometric = value;
1545
37.4k
            break;
1546
244
        case TIFF_PHOTOMETRIC_ALPHA_MASK:
1547
472
        case TIFF_PHOTOMETRIC_CIE_LAB:
1548
700
        case TIFF_PHOTOMETRIC_ICC_LAB:
1549
900
        case TIFF_PHOTOMETRIC_ITU_LAB:
1550
1.09k
        case TIFF_PHOTOMETRIC_LOG_L:
1551
1.29k
        case TIFF_PHOTOMETRIC_LOG_LUV:
1552
1.29k
            avpriv_report_missing_feature(s->avctx,
1553
1.29k
                                          "PhotometricInterpretation 0x%04X",
1554
1.29k
                                          value);
1555
1.29k
            return AVERROR_PATCHWELCOME;
1556
621
        default:
1557
621
            av_log(s->avctx, AV_LOG_ERROR, "PhotometricInterpretation %u is "
1558
621
                   "unknown\n", value);
1559
621
            return AVERROR_INVALIDDATA;
1560
39.3k
        }
1561
37.4k
        break;
1562
37.4k
    case TIFF_FILL_ORDER:
1563
1.51k
        if (value < 1 || value > 2) {
1564
462
            av_log(s->avctx, AV_LOG_ERROR,
1565
462
                   "Unknown FillOrder value %d, trying default one\n", value);
1566
462
            value = 1;
1567
462
        }
1568
1.51k
        s->fill_order = value - 1;
1569
1.51k
        break;
1570
3.36k
    case TIFF_PAL: {
1571
3.36k
        GetByteContext pal_gb[3];
1572
3.36k
        off = type_sizes[type];
1573
3.36k
        if (count / 3 > 256 ||
1574
3.05k
            bytestream2_get_bytes_left(&s->gb) < count / 3 * off * 3)
1575
592
            return AVERROR_INVALIDDATA;
1576
1577
2.77k
        pal_gb[0] = pal_gb[1] = pal_gb[2] = s->gb;
1578
2.77k
        bytestream2_skip(&pal_gb[1], count / 3 * off);
1579
2.77k
        bytestream2_skip(&pal_gb[2], count / 3 * off * 2);
1580
1581
2.77k
        off = (type_sizes[type] - 1) << 3;
1582
2.77k
        if (off > 31U) {
1583
622
            av_log(s->avctx, AV_LOG_ERROR, "palette shift %d is out of range\n", off);
1584
622
            return AVERROR_INVALIDDATA;
1585
622
        }
1586
1587
16.1k
        for (unsigned i = 0; i < count / 3; i++) {
1588
13.9k
            uint32_t p = 0xFF000000;
1589
13.9k
            p |= (ff_tget(&pal_gb[0], type, s->le) >> off) << 16;
1590
13.9k
            p |= (ff_tget(&pal_gb[1], type, s->le) >> off) << 8;
1591
13.9k
            p |=  ff_tget(&pal_gb[2], type, s->le) >> off;
1592
13.9k
            s->palette[i] = p;
1593
13.9k
        }
1594
2.15k
        s->palette_is_set = 1;
1595
2.15k
        break;
1596
2.77k
    }
1597
9.86k
    case TIFF_PLANAR:
1598
9.86k
        s->planar = value == 2;
1599
9.86k
        break;
1600
3.23k
    case TIFF_YCBCR_SUBSAMPLING:
1601
3.23k
        if (count != 2) {
1602
434
            av_log(s->avctx, AV_LOG_ERROR, "subsample count invalid\n");
1603
434
            return AVERROR_INVALIDDATA;
1604
434
        }
1605
7.97k
        for (unsigned i = 0; i < count; i++) {
1606
5.49k
            s->subsampling[i] = ff_tget(&s->gb, type, s->le);
1607
5.49k
            if (s->subsampling[i] <= 0) {
1608
320
                av_log(s->avctx, AV_LOG_ERROR, "subsampling %d is invalid\n", s->subsampling[i]);
1609
320
                s->subsampling[i] = 1;
1610
320
                return AVERROR_INVALIDDATA;
1611
320
            }
1612
5.49k
        }
1613
2.48k
        break;
1614
2.48k
    case TIFF_T4OPTIONS:
1615
1.69k
        if (s->compr == TIFF_G3) {
1616
1.35k
            if (value > INT_MAX)
1617
94
                return AVERROR_INVALIDDATA;
1618
1.26k
            s->fax_opts = value;
1619
1.26k
        }
1620
1.60k
        break;
1621
1.60k
    case TIFF_T6OPTIONS:
1622
428
        if (s->compr == TIFF_G4) {
1623
200
            if (value > INT_MAX)
1624
1
                return AVERROR_INVALIDDATA;
1625
199
            s->fax_opts = value;
1626
199
        }
1627
427
        break;
1628
427
#define ADD_METADATA(count, name, sep)\
1629
86.5k
    if ((ret = add_metadata(count, type, name, sep, s, frame)) < 0) {\
1630
24.3k
        av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\
1631
24.3k
        goto end;\
1632
24.3k
    }
1633
2.18k
    case TIFF_MODEL_PIXEL_SCALE:
1634
2.18k
        ADD_METADATA(count, "ModelPixelScaleTag", NULL);
1635
1.42k
        break;
1636
1.74k
    case TIFF_MODEL_TRANSFORMATION:
1637
1.74k
        ADD_METADATA(count, "ModelTransformationTag", NULL);
1638
429
        break;
1639
894
    case TIFF_MODEL_TIEPOINT:
1640
894
        ADD_METADATA(count, "ModelTiepointTag", NULL);
1641
611
        break;
1642
18.7k
    case TIFF_GEO_KEY_DIRECTORY:
1643
18.7k
        if (s->geotag_count) {
1644
0
            avpriv_request_sample(s->avctx, "Multiple geo key directories");
1645
0
            return AVERROR_INVALIDDATA;
1646
0
        }
1647
18.7k
        ADD_METADATA(1, "GeoTIFF_Version", NULL);
1648
17.3k
        ADD_METADATA(2, "GeoTIFF_Key_Revision", ".");
1649
17.1k
        s->geotag_count   = ff_tget_short(&s->gb, s->le);
1650
17.1k
        if (s->geotag_count > count / 4 - 1) {
1651
10.9k
            s->geotag_count = count / 4 - 1;
1652
10.9k
            av_log(s->avctx, AV_LOG_WARNING, "GeoTIFF key directory buffer shorter than specified\n");
1653
10.9k
        }
1654
17.1k
        if (   bytestream2_get_bytes_left(&s->gb) < s->geotag_count * sizeof(int16_t) * 4
1655
13.0k
            || s->geotag_count == 0) {
1656
5.04k
            s->geotag_count = 0;
1657
5.04k
            return -1;
1658
5.04k
        }
1659
12.1k
        s->geotags = av_calloc(s->geotag_count, sizeof(*s->geotags));
1660
12.1k
        if (!s->geotags) {
1661
0
            av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
1662
0
            s->geotag_count = 0;
1663
0
            goto end;
1664
0
        }
1665
447k
        for (int i = 0; i < s->geotag_count; i++) {
1666
435k
            unsigned val;
1667
435k
            s->geotags[i].key    = ff_tget_short(&s->gb, s->le);
1668
435k
            s->geotags[i].type   = ff_tget_short(&s->gb, s->le);
1669
435k
            s->geotags[i].count  = ff_tget_short(&s->gb, s->le);
1670
435k
            val                  = ff_tget_short(&s->gb, s->le);
1671
1672
435k
            if (!s->geotags[i].type) {
1673
179k
                const char *str = get_geokey_val(s->geotags[i].key, val);
1674
1675
179k
                s->geotags[i].val = str ? av_strdup(str) : av_asprintf("Unknown-%u", val);
1676
179k
                if (!s->geotags[i].val)
1677
0
                    return AVERROR(ENOMEM);
1678
179k
            } else
1679
256k
                s->geotags[i].offset = val;
1680
435k
        }
1681
12.1k
        break;
1682
12.1k
    case TIFF_GEO_DOUBLE_PARAMS:
1683
2.41k
        if (count >= INT_MAX / sizeof(int64_t))
1684
427
            return AVERROR_INVALIDDATA;
1685
1.99k
        if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
1686
301
            return AVERROR_INVALIDDATA;
1687
1.69k
        dp = av_malloc_array(count, sizeof(double));
1688
1.69k
        if (!dp) {
1689
0
            av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
1690
0
            goto end;
1691
0
        }
1692
10.2k
        for (unsigned i = 0; i < count; i++)
1693
8.51k
            dp[i] = ff_tget_double(&s->gb, s->le);
1694
8.12k
        for (int i = 0; i < s->geotag_count; i++) {
1695
6.43k
            if (s->geotags[i].type == TIFF_GEO_DOUBLE_PARAMS) {
1696
158
                if (s->geotags[i].count == 0
1697
146
                    || s->geotags[i].offset + s->geotags[i].count > count) {
1698
107
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
1699
107
                } else if (s->geotags[i].val) {
1700
0
                    av_log(s->avctx, AV_LOG_WARNING, "Duplicate GeoTIFF key %d\n", s->geotags[i].key);
1701
51
                } else {
1702
51
                    char *ap = doubles2str(&dp[s->geotags[i].offset], s->geotags[i].count, ", ");
1703
51
                    if (!ap) {
1704
0
                        av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
1705
0
                        av_freep(&dp);
1706
0
                        return AVERROR(ENOMEM);
1707
0
                    }
1708
51
                    s->geotags[i].val = ap;
1709
51
                }
1710
158
            }
1711
6.43k
        }
1712
1.69k
        av_freep(&dp);
1713
1.69k
        break;
1714
3.46k
    case TIFF_GEO_ASCII_PARAMS:
1715
3.46k
        pos = bytestream2_tell(&s->gb);
1716
29.3k
        for (int i = 0; i < s->geotag_count; i++) {
1717
26.6k
            if (s->geotags[i].type == TIFF_GEO_ASCII_PARAMS) {
1718
1.91k
                if (s->geotags[i].count == 0
1719
1.56k
                    || s->geotags[i].offset +  s->geotags[i].count > count) {
1720
1.02k
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
1721
1.02k
                } else {
1722
890
                    char *ap;
1723
1724
890
                    bytestream2_seek(&s->gb, pos + s->geotags[i].offset, SEEK_SET);
1725
890
                    if (bytestream2_get_bytes_left(&s->gb) < s->geotags[i].count)
1726
733
                        return AVERROR_INVALIDDATA;
1727
157
                    if (s->geotags[i].val)
1728
0
                        return AVERROR_INVALIDDATA;
1729
157
                    ap = av_malloc(s->geotags[i].count);
1730
157
                    if (!ap) {
1731
0
                        av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
1732
0
                        return AVERROR(ENOMEM);
1733
0
                    }
1734
157
                    bytestream2_get_bufferu(&s->gb, ap, s->geotags[i].count);
1735
157
                    ap[s->geotags[i].count - 1] = '\0'; //replace the "|" delimiter with a 0 byte
1736
157
                    s->geotags[i].val = ap;
1737
157
                }
1738
1.91k
            }
1739
26.6k
        }
1740
2.73k
        break;
1741
2.73k
    case TIFF_ICC_PROFILE:
1742
1.51k
        gb_temp = s->gb;
1743
1.51k
        bytestream2_seek(&gb_temp, off, SEEK_SET);
1744
1745
1.51k
        if (bytestream2_get_bytes_left(&gb_temp) < count)
1746
543
            return AVERROR_INVALIDDATA;
1747
1748
976
        ret = ff_frame_new_side_data(s->avctx, frame, AV_FRAME_DATA_ICC_PROFILE, count, &sd);
1749
976
        if (ret < 0)
1750
0
            return ret;
1751
976
        if (sd)
1752
976
            bytestream2_get_bufferu(&gb_temp, sd->data, count);
1753
976
        break;
1754
854
    case TIFF_ARTIST:
1755
854
        ADD_METADATA(count, "artist", NULL);
1756
344
        break;
1757
2.92k
    case TIFF_COPYRIGHT:
1758
2.92k
        ADD_METADATA(count, "copyright", NULL);
1759
1.74k
        break;
1760
6.23k
    case TIFF_DATE:
1761
6.23k
        ADD_METADATA(count, "date", NULL);
1762
2.86k
        break;
1763
1.03k
    case TIFF_DOCUMENT_NAME:
1764
1.03k
        ADD_METADATA(count, "document_name", NULL);
1765
346
        break;
1766
1.32k
    case TIFF_HOST_COMPUTER:
1767
1.32k
        ADD_METADATA(count, "computer", NULL);
1768
1.01k
        break;
1769
6.70k
    case TIFF_IMAGE_DESCRIPTION:
1770
6.70k
        ADD_METADATA(count, "description", NULL);
1771
5.42k
        break;
1772
6.40k
    case TIFF_MAKE:
1773
6.40k
        ADD_METADATA(count, "make", NULL);
1774
4.72k
        break;
1775
6.29k
    case TIFF_MODEL:
1776
6.29k
        ADD_METADATA(count, "model", NULL);
1777
4.49k
        break;
1778
2.07k
    case TIFF_PAGE_NAME:
1779
2.07k
        ADD_METADATA(count, "page_name", NULL);
1780
1.33k
        break;
1781
1.42k
    case TIFF_PAGE_NUMBER:
1782
1.42k
        ADD_METADATA(count, "page_number", " / ");
1783
        // need to seek back to re-read the page number
1784
949
        bytestream2_seek(&s->gb, -count * sizeof(uint16_t), SEEK_CUR);
1785
        // read the page number
1786
949
        s->cur_page = ff_tget_short(&s->gb, s->le);
1787
        // get back to where we were before the previous seek
1788
949
        bytestream2_seek(&s->gb, count * sizeof(uint16_t) - sizeof(uint16_t), SEEK_CUR);
1789
949
        break;
1790
10.2k
    case TIFF_SOFTWARE_NAME:
1791
10.2k
        ADD_METADATA(count, "software", NULL);
1792
1.91k
        break;
1793
42.6k
    case DNG_VERSION:
1794
42.6k
        if (count == 4) {
1795
41.5k
            unsigned int ver[4];
1796
41.5k
            ver[0] = ff_tget(&s->gb, type, s->le);
1797
41.5k
            ver[1] = ff_tget(&s->gb, type, s->le);
1798
41.5k
            ver[2] = ff_tget(&s->gb, type, s->le);
1799
41.5k
            ver[3] = ff_tget(&s->gb, type, s->le);
1800
1801
41.5k
            av_log(s->avctx, AV_LOG_DEBUG, "DNG file, version %u.%u.%u.%u\n",
1802
41.5k
                ver[0], ver[1], ver[2], ver[3]);
1803
1804
41.5k
            tiff_set_type(s, TIFF_TYPE_DNG);
1805
41.5k
        }
1806
42.6k
        break;
1807
3.01k
    case DNG_ANALOG_BALANCE:
1808
3.01k
        if (type != AV_TIFF_RATIONAL)
1809
406
            break;
1810
1811
10.4k
        for (int i = 0; i < 3; i++) {
1812
7.81k
            value  = ff_tget_long(&s->gb, s->le);
1813
7.81k
            value2 = ff_tget_long(&s->gb, s->le);
1814
7.81k
            if (!value2) {
1815
5.65k
                av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1816
5.65k
                value2 = 1;
1817
5.65k
            }
1818
1819
7.81k
            s->analog_balance[i] = value / (float)value2;
1820
7.81k
        }
1821
2.60k
        break;
1822
7.00k
    case DNG_AS_SHOT_NEUTRAL:
1823
7.00k
        if (type != AV_TIFF_RATIONAL)
1824
199
            break;
1825
1826
27.2k
        for (int i = 0; i < 3; i++) {
1827
20.4k
            value  = ff_tget_long(&s->gb, s->le);
1828
20.4k
            value2 = ff_tget_long(&s->gb, s->le);
1829
20.4k
            if (!value2) {
1830
6.99k
                av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1831
6.99k
                value2 = 1;
1832
6.99k
            }
1833
1834
20.4k
            s->as_shot_neutral[i] = value / (float)value2;
1835
20.4k
        }
1836
6.80k
        break;
1837
1.27k
    case DNG_AS_SHOT_WHITE_XY:
1838
1.27k
        if (type != AV_TIFF_RATIONAL)
1839
91
            break;
1840
1841
3.55k
        for (int i = 0; i < 2; i++) {
1842
2.36k
            value  = ff_tget_long(&s->gb, s->le);
1843
2.36k
            value2 = ff_tget_long(&s->gb, s->le);
1844
2.36k
            if (!value2) {
1845
1.41k
                av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1846
1.41k
                value2 = 1;
1847
1.41k
            }
1848
1849
2.36k
            s->as_shot_white[i] = value / (float)value2;
1850
2.36k
        }
1851
1.18k
        s->as_shot_white[2] = 1.f - s->as_shot_white[0] - s->as_shot_white[1];
1852
4.73k
        for (int i = 0; i < 3; i++) {
1853
3.55k
            s->as_shot_white[i] /= d65_white[i];
1854
3.55k
        }
1855
1.18k
        break;
1856
1.50k
    case DNG_COLOR_MATRIX1:
1857
3.46k
    case DNG_COLOR_MATRIX2:
1858
13.8k
        for (int i = 0; i < 3; i++) {
1859
41.6k
            for (int j = 0; j < 3; j++) {
1860
31.2k
                int val  = ff_tget_long(&s->gb, s->le);
1861
31.2k
                int val2 = ff_tget_long(&s->gb, s->le);
1862
31.2k
                if (!val2) {
1863
15.6k
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1864
15.6k
                    val2 = 1;
1865
15.6k
                }
1866
31.2k
                s->color_matrix[i][j] = val / (float)val2;
1867
31.2k
            }
1868
10.4k
            s->use_color_matrix = 1;
1869
10.4k
        }
1870
3.46k
        break;
1871
884
    case DNG_CAMERA_CALIBRATION1:
1872
1.13k
    case DNG_CAMERA_CALIBRATION2:
1873
4.55k
        for (int i = 0; i < 3; i++) {
1874
13.6k
            for (int j = 0; j < 3; j++) {
1875
10.2k
                int val  = ff_tget_long(&s->gb, s->le);
1876
10.2k
                int val2 = ff_tget_long(&s->gb, s->le);
1877
10.2k
                if (!val2) {
1878
7.35k
                    av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator\n");
1879
7.35k
                    val2 = 1;
1880
7.35k
                }
1881
10.2k
                s->camera_calibration[i][j] = val / (float)val2;
1882
10.2k
            }
1883
3.41k
        }
1884
1.13k
        break;
1885
3
    case CINEMADNG_TIME_CODES:
1886
10
    case CINEMADNG_FRAME_RATE:
1887
2.03k
    case CINEMADNG_T_STOP:
1888
2.04k
    case CINEMADNG_REEL_NAME:
1889
2.24k
    case CINEMADNG_CAMERA_LABEL:
1890
2.24k
        tiff_set_type(s, TIFF_TYPE_CINEMADNG);
1891
2.24k
        break;
1892
143k
    default:
1893
143k
        if (s->avctx->err_recognition & AV_EF_EXPLODE) {
1894
1.66k
            av_log(s->avctx, AV_LOG_ERROR,
1895
1.66k
                   "Unknown or unsupported tag %d/0x%0X\n",
1896
1.66k
                   tag, tag);
1897
1.66k
            return AVERROR_INVALIDDATA;
1898
1.66k
        }
1899
875k
    }
1900
3.23M
end:
1901
3.23M
    if (s->bpp > 128U) {
1902
2.48k
        av_log(s->avctx, AV_LOG_ERROR,
1903
2.48k
                "This format is not supported (bpp=%d, %d components)\n",
1904
2.48k
                s->bpp, count);
1905
2.48k
        s->bpp = 0;
1906
2.48k
        return AVERROR_INVALIDDATA;
1907
2.48k
    }
1908
3.23M
    bytestream2_seek(&s->gb, start, SEEK_SET);
1909
3.23M
    return 0;
1910
3.23M
}
1911
1912
static const float xyz2rgb[3][3] = {
1913
    { 0.412453f, 0.357580f, 0.180423f },
1914
    { 0.212671f, 0.715160f, 0.072169f },
1915
    { 0.019334f, 0.119193f, 0.950227f },
1916
};
1917
1918
static void camera_xyz_coeff(TiffContext *s,
1919
                             float rgb2cam[3][4],
1920
                             double cam2xyz[4][3])
1921
1.90k
{
1922
1.90k
    double cam2rgb[4][3], num;
1923
1.90k
    int i, j, k;
1924
1925
7.60k
    for (i = 0; i < 3; i++) {
1926
22.8k
        for (j = 0; j < 3; j++) {
1927
17.1k
            cam2rgb[i][j] = 0.;
1928
68.4k
            for (k = 0; k < 3; k++)
1929
51.3k
                cam2rgb[i][j] += cam2xyz[i][k] * xyz2rgb[k][j];
1930
17.1k
        }
1931
5.70k
    }
1932
1933
7.60k
    for (i = 0; i < 3; i++) {
1934
22.8k
        for (num = j = 0; j < 3; j++)
1935
17.1k
            num += cam2rgb[i][j];
1936
5.70k
        if (!num)
1937
1.67k
            num = 1;
1938
22.8k
        for (j = 0; j < 3; j++)
1939
17.1k
            cam2rgb[i][j] /= num;
1940
5.70k
        s->premultiply[i] = 1.f / num;
1941
5.70k
    }
1942
1.90k
}
1943
1944
static int decode_frame(AVCodecContext *avctx, AVFrame *p,
1945
                        int *got_frame, AVPacket *avpkt)
1946
486k
{
1947
486k
    TiffContext *const s = avctx->priv_data;
1948
486k
    unsigned off, last_off = 0;
1949
486k
    int le, ret, plane, planes;
1950
486k
    int i, j, entries, stride;
1951
486k
    unsigned soff, ssize;
1952
486k
    GetByteContext stripsizes;
1953
486k
    GetByteContext stripdata;
1954
486k
    int retry_for_subifd, retry_for_page;
1955
486k
    int is_dng;
1956
486k
    int has_tile_bits, has_strip_bits;
1957
1958
486k
    av_exif_free(&s->exif_meta);
1959
    /* this will not parse the image data */
1960
486k
    ret = av_exif_parse_buffer(avctx, avpkt->data, avpkt->size, &s->exif_meta, AV_EXIF_TIFF_HEADER);
1961
486k
    if (ret < 0)
1962
472k
        av_log(avctx, AV_LOG_ERROR, "could not parse EXIF data: %s\n", av_err2str(ret));
1963
1964
486k
    bytestream2_init(&s->gb, avpkt->data, avpkt->size);
1965
1966
    // parse image header
1967
486k
    if ((ret = ff_tdecode_header(&s->gb, &le, &off))) {
1968
151k
        av_log(avctx, AV_LOG_ERROR, "Invalid TIFF header\n");
1969
151k
        return ret;
1970
335k
    } else if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
1971
17.1k
        av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
1972
17.1k
        return AVERROR_INVALIDDATA;
1973
17.1k
    }
1974
318k
    s->le          = le;
1975
    // TIFF_BPP is not a required tag and defaults to 1
1976
1977
318k
    s->tiff_type   = TIFF_TYPE_TIFF;
1978
318k
    s->use_color_matrix = 0;
1979
319k
again:
1980
319k
    s->is_thumbnail = 0;
1981
319k
    s->bppcount    = s->bpp = 1;
1982
319k
    s->photometric = TIFF_PHOTOMETRIC_NONE;
1983
319k
    s->compr       = TIFF_RAW;
1984
319k
    s->fill_order  = 0;
1985
319k
    s->white_level = 0;
1986
319k
    s->is_bayer    = 0;
1987
319k
    s->is_tiled    = 0;
1988
319k
    s->is_jpeg     = 0;
1989
319k
    s->cur_page    = 0;
1990
319k
    s->last_tag    = 0;
1991
1992
20.9G
    for (i = 0; i < 65536; i++)
1993
20.9G
        s->dng_lut[i] = i;
1994
1995
1.59M
    for (i = 0; i < FF_ARRAY_ELEMS(s->black_level); i++)
1996
1.27M
        s->black_level[i] = 0.f;
1997
1998
1.59M
    for (i = 0; i < FF_ARRAY_ELEMS(s->as_shot_neutral); i++)
1999
1.27M
        s->as_shot_neutral[i] = 0.f;
2000
2001
1.59M
    for (i = 0; i < FF_ARRAY_ELEMS(s->as_shot_white); i++)
2002
1.27M
        s->as_shot_white[i] = 1.f;
2003
2004
1.59M
    for (i = 0; i < FF_ARRAY_ELEMS(s->analog_balance); i++)
2005
1.27M
        s->analog_balance[i] = 1.f;
2006
2007
1.59M
    for (i = 0; i < FF_ARRAY_ELEMS(s->premultiply); i++)
2008
1.27M
        s->premultiply[i] = 1.f;
2009
2010
1.59M
    for (i = 0; i < 4; i++)
2011
6.39M
        for (j = 0; j < 4; j++)
2012
5.11M
            s->camera_calibration[i][j] = i == j;
2013
2014
319k
    free_geotags(s);
2015
2016
    // Reset these offsets so we can tell if they were set this frame
2017
319k
    s->stripsizesoff = s->strippos = 0;
2018
    /* parse image file directory */
2019
319k
    bytestream2_seek(&s->gb, off, SEEK_SET);
2020
319k
    entries = ff_tget_short(&s->gb, le);
2021
319k
    if (bytestream2_get_bytes_left(&s->gb) < entries * 12)
2022
40.0k
        return AVERROR_INVALIDDATA;
2023
3.51M
    for (i = 0; i < entries; i++) {
2024
3.27M
        if ((ret = tiff_decode_tag(s, p)) < 0)
2025
47.2k
            return ret;
2026
3.27M
    }
2027
2028
232k
    if (s->get_thumbnail && !s->is_thumbnail) {
2029
0
        av_log(avctx, AV_LOG_INFO, "No embedded thumbnail present\n");
2030
0
        return 0;
2031
0
    }
2032
2033
    /** whether we should process this IFD's SubIFD */
2034
232k
    retry_for_subifd = s->sub_ifd && (s->get_subimage || (!s->get_thumbnail && s->is_thumbnail));
2035
    /** whether we should process this multi-page IFD's next page */
2036
232k
    retry_for_page = s->get_page && s->cur_page + 1 < s->get_page;  // get_page is 1-indexed
2037
2038
232k
    if (retry_for_page) {
2039
        // set offset to the next IFD
2040
0
        off = ff_tget_long(&s->gb, le);
2041
232k
    } else if (retry_for_subifd) {
2042
        // set offset to the SubIFD
2043
3.06k
        off = s->sub_ifd;
2044
3.06k
    }
2045
2046
232k
    if (retry_for_subifd || retry_for_page) {
2047
3.06k
        if (!off) {
2048
0
            av_log(avctx, AV_LOG_ERROR, "Requested entry not found\n");
2049
0
            return AVERROR_INVALIDDATA;
2050
0
        }
2051
3.06k
        if (off <= last_off) {
2052
721
            avpriv_request_sample(s->avctx, "non increasing IFD offset");
2053
721
            return AVERROR_INVALIDDATA;
2054
721
        }
2055
2.33k
        last_off = off;
2056
2.33k
        if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
2057
899
            av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
2058
899
            return AVERROR_INVALIDDATA;
2059
899
        }
2060
1.44k
        s->sub_ifd = 0;
2061
1.44k
        goto again;
2062
2.33k
    }
2063
2064
    /* At this point we've decided on which (Sub)IFD to process */
2065
2066
229k
    is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
2067
2068
646k
    for (i = 0; i<s->geotag_count; i++) {
2069
417k
        const char *keyname = get_geokey_name(s->geotags[i].key);
2070
417k
        if (!keyname) {
2071
391k
            av_log(avctx, AV_LOG_WARNING, "Unknown or unsupported GeoTIFF key %d\n", s->geotags[i].key);
2072
391k
            continue;
2073
391k
        }
2074
25.4k
        if (get_geokey_type(s->geotags[i].key) != s->geotags[i].type) {
2075
4.49k
            av_log(avctx, AV_LOG_WARNING, "Type of GeoTIFF key %d is wrong\n", s->geotags[i].key);
2076
4.49k
            continue;
2077
4.49k
        }
2078
20.9k
        ret = av_dict_set(&p->metadata, keyname, s->geotags[i].val, AV_DICT_DONT_STRDUP_VAL);
2079
20.9k
        s->geotags[i].val = NULL;
2080
20.9k
        if (ret<0) {
2081
0
            av_log(avctx, AV_LOG_ERROR, "Writing metadata with key '%s' failed\n", keyname);
2082
0
            return ret;
2083
0
        }
2084
20.9k
    }
2085
2086
229k
    if (is_dng) {
2087
42.4k
        double cam2xyz[4][3];
2088
42.4k
        float cmatrix[3][4];
2089
42.4k
        float pmin = FLT_MAX;
2090
42.4k
        int bps;
2091
2092
169k
        for (i = 0; i < 3; i++) {
2093
508k
            for (j = 0; j < 3; j++)
2094
381k
                s->camera_calibration[i][j] *= s->analog_balance[i];
2095
127k
        }
2096
2097
42.4k
        if (!s->use_color_matrix) {
2098
162k
            for (i = 0; i < 3; i++) {
2099
121k
                if (s->camera_calibration[i][i])
2100
121k
                    s->premultiply[i] /= s->camera_calibration[i][i];
2101
121k
            }
2102
40.5k
        } else {
2103
7.60k
            for (int c = 0; c < 3; c++) {
2104
22.8k
                for (i = 0; i < 3; i++) {
2105
17.1k
                    cam2xyz[c][i] = 0.;
2106
68.4k
                    for (j = 0; j < 3; j++)
2107
51.3k
                        cam2xyz[c][i] += s->camera_calibration[c][j] * s->color_matrix[j][i] * s->as_shot_white[i];
2108
17.1k
                }
2109
5.70k
            }
2110
2111
1.90k
            camera_xyz_coeff(s, cmatrix, cam2xyz);
2112
1.90k
        }
2113
2114
169k
        for (int c = 0; c < 3; c++)
2115
127k
            pmin = fminf(pmin, s->premultiply[c]);
2116
2117
169k
        for (int c = 0; c < 3; c++)
2118
127k
            s->premultiply[c] /= pmin;
2119
2120
42.4k
        if (s->bpp % s->bppcount)
2121
200
            return AVERROR_INVALIDDATA;
2122
42.2k
        bps = s->bpp / s->bppcount;
2123
42.2k
        if (bps < 8 || bps > 32)
2124
2.54k
            return AVERROR_INVALIDDATA;
2125
2126
39.6k
        if (s->white_level == 0)
2127
39.4k
            s->white_level = (1LL << bps) - 1; /* Default value as per the spec */
2128
2129
39.6k
        if (s->white_level <= s->black_level[0]) {
2130
370
            av_log(avctx, AV_LOG_ERROR, "BlackLevel (%g) must be less than WhiteLevel (%"PRId32")\n",
2131
370
                s->black_level[0], s->white_level);
2132
370
            return AVERROR_INVALIDDATA;
2133
370
        }
2134
2135
39.2k
        if (s->planar)
2136
353
            return AVERROR_PATCHWELCOME;
2137
39.2k
    }
2138
2139
226k
    if (!s->is_tiled && !s->strippos && !s->stripoff) {
2140
36.6k
        av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
2141
36.6k
        return AVERROR_INVALIDDATA;
2142
36.6k
    }
2143
2144
189k
    has_tile_bits  = s->is_tiled || s->tile_byte_counts_offset || s->tile_offsets_offset || s->tile_width || s->tile_length;
2145
189k
    has_strip_bits = s->strippos || s->strips || s->stripoff || s->rps || s->sot || s->sstype || s->stripsize || s->stripsizesoff;
2146
2147
189k
    if (has_tile_bits && has_strip_bits) {
2148
8.45k
        int tiled_dng = s->is_tiled && is_dng;
2149
8.45k
        av_log(avctx, tiled_dng ? AV_LOG_WARNING : AV_LOG_ERROR, "Tiled TIFF is not allowed to strip\n");
2150
8.45k
        if (!tiled_dng)
2151
7.62k
            return AVERROR_INVALIDDATA;
2152
8.45k
    }
2153
2154
    /* now we have the data and may start decoding */
2155
181k
    if ((ret = init_image(s, p)) <= 0)
2156
36.5k
        return ret;
2157
2158
145k
    if (!s->is_tiled || has_strip_bits) {
2159
142k
        if (s->strips == 1 && !s->stripsize) {
2160
5.83k
            av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
2161
5.83k
            s->stripsize = avpkt->size - s->stripoff;
2162
5.83k
        }
2163
2164
142k
        if (s->stripsizesoff) {
2165
1.63k
            if (s->stripsizesoff >= (unsigned)avpkt->size)
2166
272
                return AVERROR_INVALIDDATA;
2167
1.36k
            bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff,
2168
1.36k
                            avpkt->size - s->stripsizesoff);
2169
1.36k
        }
2170
142k
        if (s->strippos) {
2171
5.96k
            if (s->strippos >= (unsigned)avpkt->size)
2172
3.79k
                return AVERROR_INVALIDDATA;
2173
2.16k
            bytestream2_init(&stripdata, avpkt->data + s->strippos,
2174
2.16k
                            avpkt->size - s->strippos);
2175
2.16k
        }
2176
2177
138k
        if (s->rps <= 0 || s->rps % s->subsampling[1]) {
2178
3.01k
            av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
2179
3.01k
            return AVERROR_INVALIDDATA;
2180
3.01k
        }
2181
138k
    }
2182
2183
138k
    if (s->photometric == TIFF_PHOTOMETRIC_LINEAR_RAW ||
2184
137k
        s->photometric == TIFF_PHOTOMETRIC_CFA) {
2185
805
        p->color_trc = AVCOL_TRC_LINEAR;
2186
137k
    } else if (s->photometric == TIFF_PHOTOMETRIC_BLACK_IS_ZERO) {
2187
527
        p->color_trc = AVCOL_TRC_GAMMA22;
2188
527
    }
2189
2190
    /* Handle DNG images with JPEG-compressed tiles */
2191
2192
138k
    if (is_dng && s->is_tiled) {
2193
2.66k
        if (!s->is_jpeg) {
2194
85
            avpriv_report_missing_feature(avctx, "DNG uncompressed tiled images");
2195
85
            return AVERROR_PATCHWELCOME;
2196
2.57k
        } else if (!s->is_bayer) {
2197
216
            avpriv_report_missing_feature(avctx, "DNG JPG-compressed tiled non-bayer-encoded images");
2198
216
            return AVERROR_PATCHWELCOME;
2199
2.36k
        } else {
2200
2.36k
            if ((ret = dng_decode_tiles(avctx, p, avpkt)) > 0)
2201
202
                *got_frame = 1;
2202
2.36k
            return ret;
2203
2.36k
        }
2204
2.66k
    }
2205
2206
    /* Handle TIFF images and DNG images with uncompressed strips (non-tiled) */
2207
2208
135k
    planes = s->planar ? s->bppcount : 1;
2209
206k
    for (plane = 0; plane < planes; plane++) {
2210
138k
        uint8_t *five_planes = NULL;
2211
138k
        int remaining = avpkt->size;
2212
138k
        int decoded_height;
2213
138k
        uint8_t *dst = p->data[plane];
2214
138k
        stride = p->linesize[plane];
2215
138k
        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
2216
4.56k
            s->avctx->pix_fmt == AV_PIX_FMT_RGBA) {
2217
11
            stride = stride * 5 / 4;
2218
11
            five_planes =
2219
11
            dst = av_calloc(s->height, stride);
2220
11
            if (!dst)
2221
0
                return AVERROR(ENOMEM);
2222
11
        }
2223
180k
        for (i = 0; i < s->height; i += s->rps) {
2224
163k
            if (i)
2225
24.8k
                dst += s->rps * stride;
2226
163k
            if (s->stripsizesoff)
2227
2.65k
                ssize = ff_tget(&stripsizes, s->sstype, le);
2228
160k
            else
2229
160k
                ssize = s->stripsize;
2230
2231
163k
            if (s->strippos)
2232
3.42k
                soff = ff_tget(&stripdata, s->sot, le);
2233
159k
            else
2234
159k
                soff = s->stripoff;
2235
2236
163k
            if (soff > avpkt->size || ssize > avpkt->size - soff || ssize > remaining) {
2237
64.4k
                av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
2238
64.4k
                av_freep(&five_planes);
2239
64.4k
                return AVERROR_INVALIDDATA;
2240
64.4k
            }
2241
98.6k
            remaining -= ssize;
2242
98.6k
            if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i,
2243
98.6k
                                         FFMIN(s->rps, s->height - i))) < 0) {
2244
56.5k
                if (avctx->err_recognition & AV_EF_EXPLODE) {
2245
2.66k
                    av_freep(&five_planes);
2246
2.66k
                    return ret;
2247
2.66k
                }
2248
53.9k
                break;
2249
56.5k
            }
2250
98.6k
        }
2251
71.1k
        decoded_height = FFMIN(i, s->height);
2252
2253
71.1k
        if (s->predictor == 2) {
2254
6.42k
            if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
2255
68
                av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported");
2256
68
                return AVERROR_PATCHWELCOME;
2257
68
            }
2258
6.35k
            dst   = five_planes ? five_planes : p->data[plane];
2259
6.35k
            soff  = s->bpp >> 3;
2260
6.35k
            if (s->planar)
2261
634
                soff  = FFMAX(soff / s->bppcount, 1);
2262
6.35k
            ssize = s->width * soff;
2263
6.35k
            if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE ||
2264
6.02k
                s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE ||
2265
6.02k
                s->avctx->pix_fmt == AV_PIX_FMT_GRAY16LE ||
2266
5.77k
                s->avctx->pix_fmt == AV_PIX_FMT_YA16LE ||
2267
5.24k
                s->avctx->pix_fmt == AV_PIX_FMT_GBRP16LE ||
2268
4.94k
                s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16LE) {
2269
6.27k
                for (i = 0; i < decoded_height; i++) {
2270
225k
                    for (j = soff; j < ssize; j += 2)
2271
221k
                        AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
2272
4.80k
                    dst += stride;
2273
4.80k
                }
2274
4.88k
            } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
2275
4.88k
                       s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE ||
2276
4.88k
                       s->avctx->pix_fmt == AV_PIX_FMT_GRAY16BE ||
2277
4.32k
                       s->avctx->pix_fmt == AV_PIX_FMT_YA16BE ||
2278
4.32k
                       s->avctx->pix_fmt == AV_PIX_FMT_GBRP16BE ||
2279
4.32k
                       s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) {
2280
1.43k
                for (i = 0; i < decoded_height; i++) {
2281
3.03k
                    for (j = soff; j < ssize; j += 2)
2282
2.16k
                        AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));
2283
867
                    dst += stride;
2284
867
                }
2285
4.31k
            } else {
2286
14.0k
                for (i = 0; i < decoded_height; i++) {
2287
1.16M
                    for (j = soff; j < ssize; j++)
2288
1.15M
                        dst[j] += dst[j - soff];
2289
9.72k
                    dst += stride;
2290
9.72k
                }
2291
4.31k
            }
2292
6.35k
        }
2293
2294
        /* Floating point predictor
2295
           TIFF Technical Note 3 http://chriscox.org/TIFFTN3d1.pdf */
2296
71.0k
        if (s->predictor == 3) {
2297
657
            int channels = s->bppcount;
2298
657
            int group_size;
2299
657
            uint8_t *tmpbuf;
2300
657
            int bpc;
2301
2302
657
            dst   = five_planes ? five_planes : p->data[plane];
2303
657
            soff  = s->bpp >> 3;
2304
657
            if (s->planar) {
2305
80
                soff  = FFMAX(soff / s->bppcount, 1);
2306
80
                channels = 1;
2307
80
            }
2308
657
            ssize = s->width * soff;
2309
657
            bpc = FFMAX(soff / s->bppcount, 1); /* Bytes per component */
2310
657
            group_size = s->width * channels;
2311
2312
657
            tmpbuf = av_malloc(ssize);
2313
657
            if (!tmpbuf) {
2314
0
                av_free(five_planes);
2315
0
                return AVERROR(ENOMEM);
2316
0
            }
2317
2318
657
            if (s->avctx->pix_fmt == AV_PIX_FMT_RGBF32LE ||
2319
657
                s->avctx->pix_fmt == AV_PIX_FMT_RGBAF32LE) {
2320
1
                for (i = 0; i < decoded_height; i++) {
2321
                    /* Copy first sample byte for each channel */
2322
0
                    for (j = 0; j < channels; j++)
2323
0
                        tmpbuf[j] = dst[j];
2324
2325
                    /* Decode horizontal differences */
2326
0
                    for (j = channels; j < ssize; j++)
2327
0
                        tmpbuf[j] = dst[j] + tmpbuf[j-channels];
2328
2329
                    /* Combine shuffled bytes from their separate groups. Each
2330
                       byte of every floating point value in a row of pixels is
2331
                       split and combined into separate groups. A group of all
2332
                       the sign/exponents bytes in the row and groups for each
2333
                       of the upper, mid, and lower mantissa bytes in the row. */
2334
0
                    for (j = 0; j < group_size; j++) {
2335
0
                        for (int k = 0; k < bpc; k++) {
2336
0
                            dst[bpc * j + k] = tmpbuf[(bpc - k - 1) * group_size + j];
2337
0
                        }
2338
0
                    }
2339
0
                    dst += stride;
2340
0
                }
2341
656
            } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGBF32BE ||
2342
656
                       s->avctx->pix_fmt == AV_PIX_FMT_RGBAF32BE) {
2343
                /* Same as LE only the shuffle at the end is reversed */
2344
0
                for (i = 0; i < decoded_height; i++) {
2345
0
                    for (j = 0; j < channels; j++)
2346
0
                        tmpbuf[j] = dst[j];
2347
2348
0
                    for (j = channels; j < ssize; j++)
2349
0
                        tmpbuf[j] = dst[j] + tmpbuf[j-channels];
2350
2351
0
                    for (j = 0; j < group_size; j++) {
2352
0
                        for (int k = 0; k < bpc; k++) {
2353
0
                            dst[bpc * j + k] = tmpbuf[k * group_size + j];
2354
0
                        }
2355
0
                    }
2356
0
                    dst += stride;
2357
0
                }
2358
656
            } else {
2359
656
                av_log(s->avctx, AV_LOG_ERROR, "unsupported floating point pixel format\n");
2360
656
            }
2361
657
            av_free(tmpbuf);
2362
657
        }
2363
2364
71.0k
        if (s->photometric == TIFF_PHOTOMETRIC_WHITE_IS_ZERO) {
2365
1.59k
            int c = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255);
2366
1.59k
            dst = p->data[plane];
2367
1.77M
            for (i = 0; i < s->height; i++) {
2368
531M
                for (j = 0; j < stride; j++)
2369
529M
                    dst[j] = c - dst[j];
2370
1.77M
                dst += stride;
2371
1.77M
            }
2372
1.59k
        }
2373
2374
71.0k
        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
2375
3.67k
            (s->avctx->pix_fmt == AV_PIX_FMT_RGB0 || s->avctx->pix_fmt == AV_PIX_FMT_RGBA)) {
2376
347
            int x = s->avctx->pix_fmt == AV_PIX_FMT_RGB0 ? 4 : 5;
2377
347
            uint8_t *src = five_planes ? five_planes : p->data[plane];
2378
347
            dst = p->data[plane];
2379
311k
            for (i = 0; i < s->height; i++) {
2380
30.1M
                for (j = 0; j < s->width; j++) {
2381
29.8M
                    int k =  255 - src[x * j + 3];
2382
29.8M
                    int r = (255 - src[x * j    ]) * k;
2383
29.8M
                    int g = (255 - src[x * j + 1]) * k;
2384
29.8M
                    int b = (255 - src[x * j + 2]) * k;
2385
29.8M
                    dst[4 * j    ] = r * 257 >> 16;
2386
29.8M
                    dst[4 * j + 1] = g * 257 >> 16;
2387
29.8M
                    dst[4 * j + 2] = b * 257 >> 16;
2388
29.8M
                    dst[4 * j + 3] = s->avctx->pix_fmt == AV_PIX_FMT_RGBA ? src[x * j + 4] : 255;
2389
29.8M
                }
2390
311k
                src += stride;
2391
311k
                dst += p->linesize[plane];
2392
311k
            }
2393
347
            av_freep(&five_planes);
2394
70.7k
        } else if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
2395
3.32k
            s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) {
2396
0
            dst = p->data[plane];
2397
0
            for (i = 0; i < s->height; i++) {
2398
0
                for (j = 0; j < s->width; j++) {
2399
0
                    uint64_t k =  65535 - AV_RB16(dst + 8 * j + 6);
2400
0
                    uint64_t r = (65535 - AV_RB16(dst + 8 * j    )) * k;
2401
0
                    uint64_t g = (65535 - AV_RB16(dst + 8 * j + 2)) * k;
2402
0
                    uint64_t b = (65535 - AV_RB16(dst + 8 * j + 4)) * k;
2403
0
                    AV_WB16(dst + 8 * j    , r * 65537 >> 32);
2404
0
                    AV_WB16(dst + 8 * j + 2, g * 65537 >> 32);
2405
0
                    AV_WB16(dst + 8 * j + 4, b * 65537 >> 32);
2406
0
                    AV_WB16(dst + 8 * j + 6, 65535);
2407
0
                }
2408
0
                dst += p->linesize[plane];
2409
0
            }
2410
0
        }
2411
71.0k
    }
2412
2413
68.3k
    if (s->planar && s->bppcount > 2) {
2414
1.11k
        FFSWAP(uint8_t*, p->data[0],     p->data[2]);
2415
1.11k
        FFSWAP(int,      p->linesize[0], p->linesize[2]);
2416
1.11k
        FFSWAP(uint8_t*, p->data[0],     p->data[1]);
2417
1.11k
        FFSWAP(int,      p->linesize[0], p->linesize[1]);
2418
1.11k
    }
2419
2420
68.3k
    if (s->is_bayer && s->white_level && s->bpp == 16 && !is_dng) {
2421
487
        uint16_t *dst = (uint16_t *)p->data[0];
2422
122k
        for (i = 0; i < s->height; i++) {
2423
11.8M
            for (j = 0; j < s->width; j++)
2424
11.6M
                dst[j] = FFMIN((dst[j] / (float)s->white_level) * 65535, 65535);
2425
121k
            dst += stride / 2;
2426
121k
        }
2427
487
    }
2428
2429
68.3k
    ret = ff_decode_exif_attach_ifd(avctx, p, &s->exif_meta);
2430
68.3k
    if (ret < 0)
2431
0
        av_log(avctx, AV_LOG_ERROR, "error attaching EXIF ifd: %s\n", av_err2str(ret));
2432
2433
68.3k
    *got_frame = 1;
2434
2435
68.3k
    return avpkt->size;
2436
135k
}
2437
2438
static av_cold int tiff_init(AVCodecContext *avctx)
2439
12.3k
{
2440
12.3k
    TiffContext *s = avctx->priv_data;
2441
12.3k
    int ret;
2442
2443
12.3k
    s->width  = 0;
2444
12.3k
    s->height = 0;
2445
12.3k
    s->subsampling[0] =
2446
12.3k
    s->subsampling[1] = 1;
2447
12.3k
    s->avctx  = avctx;
2448
12.3k
    ff_lzw_decode_open(&s->lzw);
2449
12.3k
    if (!s->lzw)
2450
0
        return AVERROR(ENOMEM);
2451
12.3k
    ff_ccitt_unpack_init();
2452
2453
    /* Allocate JPEG frame */
2454
12.3k
    s->jpgframe = av_frame_alloc();
2455
12.3k
    s->jpkt     = av_packet_alloc();
2456
12.3k
    if (!s->jpgframe || !s->jpkt)
2457
0
        return AVERROR(ENOMEM);
2458
2459
    /* Prepare everything needed for JPEG decoding */
2460
12.3k
    EXTERN const FFCodec ff_mjpeg_decoder;
2461
12.3k
    s->avctx_mjpeg = avcodec_alloc_context3(&ff_mjpeg_decoder.p);
2462
12.3k
    if (!s->avctx_mjpeg)
2463
0
        return AVERROR(ENOMEM);
2464
12.3k
    s->avctx_mjpeg->flags = avctx->flags;
2465
12.3k
    s->avctx_mjpeg->flags2 = avctx->flags2;
2466
12.3k
    s->avctx_mjpeg->idct_algo = avctx->idct_algo;
2467
12.3k
    s->avctx_mjpeg->max_pixels = avctx->max_pixels;
2468
12.3k
    ret = avcodec_open2(s->avctx_mjpeg, NULL, NULL);
2469
12.3k
    if (ret < 0) {
2470
0
        return ret;
2471
0
    }
2472
2473
12.3k
    return 0;
2474
12.3k
}
2475
2476
static av_cold int tiff_end(AVCodecContext *avctx)
2477
12.3k
{
2478
12.3k
    TiffContext *const s = avctx->priv_data;
2479
2480
12.3k
    free_geotags(s);
2481
12.3k
    av_exif_free(&s->exif_meta);
2482
2483
12.3k
    ff_lzw_decode_close(&s->lzw);
2484
12.3k
    av_freep(&s->deinvert_buf);
2485
12.3k
    s->deinvert_buf_size = 0;
2486
12.3k
    av_freep(&s->yuv_line);
2487
12.3k
    s->yuv_line_size = 0;
2488
12.3k
    av_frame_free(&s->jpgframe);
2489
12.3k
    av_packet_free(&s->jpkt);
2490
12.3k
    avcodec_free_context(&s->avctx_mjpeg);
2491
12.3k
    return 0;
2492
12.3k
}
2493
2494
#define OFFSET(x) offsetof(TiffContext, x)
2495
static const AVOption tiff_options[] = {
2496
    { "subimage", "decode subimage instead if available", OFFSET(get_subimage), AV_OPT_TYPE_BOOL, {.i64=0},  0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
2497
    { "thumbnail", "decode embedded thumbnail subimage instead if available", OFFSET(get_thumbnail), AV_OPT_TYPE_BOOL, {.i64=0},  0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
2498
    { "page", "page number of multi-page image to decode (starting from 1)", OFFSET(get_page), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
2499
    { NULL },
2500
};
2501
2502
static const AVClass tiff_decoder_class = {
2503
    .class_name = "TIFF decoder",
2504
    .item_name  = av_default_item_name,
2505
    .option     = tiff_options,
2506
    .version    = LIBAVUTIL_VERSION_INT,
2507
};
2508
2509
const FFCodec ff_tiff_decoder = {
2510
    .p.name         = "tiff",
2511
    CODEC_LONG_NAME("TIFF image"),
2512
    .p.type         = AVMEDIA_TYPE_VIDEO,
2513
    .p.id           = AV_CODEC_ID_TIFF,
2514
    .priv_data_size = sizeof(TiffContext),
2515
    .init           = tiff_init,
2516
    .close          = tiff_end,
2517
    FF_CODEC_DECODE_CB(decode_frame),
2518
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2519
    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_ICC_PROFILES |
2520
                      FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2521
    .p.priv_class   = &tiff_decoder_class,
2522
};