Coverage Report

Created: 2026-07-25 07:52

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