]> git.sesse.net Git - ffmpeg/blob - libavcodec/tiff.c
Merge commit '2612c4dc78e1750c4653bf5a9f2cbe95f7b4ed6e'
[ffmpeg] / libavcodec / tiff.c
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 "avcodec.h"
28 #include "bytestream.h"
29 #include "config.h"
30 #if CONFIG_ZLIB
31 #include <zlib.h>
32 #endif
33 #include "lzw.h"
34 #include "tiff.h"
35 #include "tiff_data.h"
36 #include "faxcompr.h"
37 #include "internal.h"
38 #include "mathops.h"
39 #include "libavutil/attributes.h"
40 #include "libavutil/intreadwrite.h"
41 #include "libavutil/imgutils.h"
42 #include "libavutil/avstring.h"
43
44 typedef struct TiffContext {
45     AVCodecContext *avctx;
46     AVFrame picture;
47     GetByteContext gb;
48
49     int width, height;
50     unsigned int bpp, bppcount;
51     uint32_t palette[256];
52     int palette_is_set;
53     int le;
54     enum TiffCompr compr;
55     int invert;
56     int fax_opts;
57     int predictor;
58     int fill_order;
59
60     int strips, rps, sstype;
61     int sot;
62     int stripsizesoff, stripsize, stripoff, strippos;
63     LZWState *lzw;
64
65     uint8_t *deinvert_buf;
66     int deinvert_buf_size;
67
68     int geotag_count;
69     TiffGeoTag *geotags;
70 } TiffContext;
71
72 static unsigned tget_short(GetByteContext *gb, int le)
73 {
74     unsigned v = le ? bytestream2_get_le16(gb) : bytestream2_get_be16(gb);
75     return v;
76 }
77
78 static unsigned tget_long(GetByteContext *gb, int le)
79 {
80     unsigned v = le ? bytestream2_get_le32(gb) : bytestream2_get_be32(gb);
81     return v;
82 }
83
84 static double tget_double(GetByteContext *gb, int le)
85 {
86     av_alias64 i = { .u64 = le ? bytestream2_get_le64(gb) : bytestream2_get_be64(gb)};
87     return i.f64;
88 }
89
90 static unsigned tget(GetByteContext *gb, int type, int le)
91 {
92     switch (type) {
93     case TIFF_BYTE : return bytestream2_get_byte(gb);
94     case TIFF_SHORT: return tget_short(gb, le);
95     case TIFF_LONG : return tget_long(gb, le);
96     default        : return UINT_MAX;
97     }
98 }
99
100 static void free_geotags(TiffContext *const s)
101 {
102     int i;
103     for (i = 0; i < s->geotag_count; i++) {
104         if (s->geotags[i].val)
105             av_freep(&s->geotags[i].val);
106     }
107     av_freep(&s->geotags);
108 }
109
110 #define RET_GEOKEY(TYPE, array, element)\
111     if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
112         key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_name_type_map))\
113         return ff_tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].element;
114
115 static const char *get_geokey_name(int key)
116 {
117     RET_GEOKEY(VERT, vert, name);
118     RET_GEOKEY(PROJ, proj, name);
119     RET_GEOKEY(GEOG, geog, name);
120     RET_GEOKEY(CONF, conf, name);
121
122     return NULL;
123 }
124
125 static int get_geokey_type(int key)
126 {
127     RET_GEOKEY(VERT, vert, type);
128     RET_GEOKEY(PROJ, proj, type);
129     RET_GEOKEY(GEOG, geog, type);
130     RET_GEOKEY(CONF, conf, type);
131
132     return AVERROR_INVALIDDATA;
133 }
134
135 static int cmp_id_key(const void *id, const void *k)
136 {
137     return *(const int*)id - ((const TiffGeoTagKeyName*)k)->key;
138 }
139
140 static const char *search_keyval(const TiffGeoTagKeyName *keys, int n, int id)
141 {
142     return ((TiffGeoTagKeyName*)bsearch(&id, keys, n, sizeof(keys[0]), cmp_id_key))->name;
143 }
144
145 static char *get_geokey_val(int key, int val)
146 {
147     char *ap;
148
149     if (val == TIFF_GEO_KEY_UNDEFINED)
150         return av_strdup("undefined");
151     if (val == TIFF_GEO_KEY_USER_DEFINED)
152         return av_strdup("User-Defined");
153
154 #define RET_GEOKEY_VAL(TYPE, array)\
155     if (val >= TIFF_##TYPE##_OFFSET &&\
156         val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_codes))\
157         return av_strdup(ff_tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET]);
158
159     switch (key) {
160     case TIFF_GT_MODEL_TYPE_GEOKEY:
161         RET_GEOKEY_VAL(GT_MODEL_TYPE, gt_model_type);
162         break;
163     case TIFF_GT_RASTER_TYPE_GEOKEY:
164         RET_GEOKEY_VAL(GT_RASTER_TYPE, gt_raster_type);
165         break;
166     case TIFF_GEOG_LINEAR_UNITS_GEOKEY:
167     case TIFF_PROJ_LINEAR_UNITS_GEOKEY:
168     case TIFF_VERTICAL_UNITS_GEOKEY:
169         RET_GEOKEY_VAL(LINEAR_UNIT, linear_unit);
170         break;
171     case TIFF_GEOG_ANGULAR_UNITS_GEOKEY:
172     case TIFF_GEOG_AZIMUTH_UNITS_GEOKEY:
173         RET_GEOKEY_VAL(ANGULAR_UNIT, angular_unit);
174         break;
175     case TIFF_GEOGRAPHIC_TYPE_GEOKEY:
176         RET_GEOKEY_VAL(GCS_TYPE, gcs_type);
177         RET_GEOKEY_VAL(GCSE_TYPE, gcse_type);
178         break;
179     case TIFF_GEOG_GEODETIC_DATUM_GEOKEY:
180         RET_GEOKEY_VAL(GEODETIC_DATUM, geodetic_datum);
181         RET_GEOKEY_VAL(GEODETIC_DATUM_E, geodetic_datum_e);
182         break;
183     case TIFF_GEOG_ELLIPSOID_GEOKEY:
184         RET_GEOKEY_VAL(ELLIPSOID, ellipsoid);
185         break;
186     case TIFF_GEOG_PRIME_MERIDIAN_GEOKEY:
187         RET_GEOKEY_VAL(PRIME_MERIDIAN, prime_meridian);
188         break;
189     case TIFF_PROJECTED_CS_TYPE_GEOKEY:
190         return av_strdup(search_keyval(ff_tiff_proj_cs_type_codes, FF_ARRAY_ELEMS(ff_tiff_proj_cs_type_codes), val));
191         break;
192     case TIFF_PROJECTION_GEOKEY:
193         return av_strdup(search_keyval(ff_tiff_projection_codes, FF_ARRAY_ELEMS(ff_tiff_projection_codes), val));
194         break;
195     case TIFF_PROJ_COORD_TRANS_GEOKEY:
196         RET_GEOKEY_VAL(COORD_TRANS, coord_trans);
197         break;
198     case TIFF_VERTICAL_CS_TYPE_GEOKEY:
199         RET_GEOKEY_VAL(VERT_CS, vert_cs);
200         RET_GEOKEY_VAL(ORTHO_VERT_CS, ortho_vert_cs);
201         break;
202
203     }
204
205     ap = av_malloc(14);
206     if (ap)
207         snprintf(ap, 14, "Unknown-%d", val);
208     return ap;
209 }
210
211 static char *doubles2str(double *dp, int count, const char *sep)
212 {
213     int i;
214     char *ap, *ap0;
215     int component_len;
216     if (!sep) sep = ", ";
217     component_len = 15 + strlen(sep);
218     ap = av_malloc(component_len * count);
219     if (!ap)
220         return NULL;
221     ap0   = ap;
222     ap[0] = '\0';
223     for (i = 0; i < count; i++) {
224         unsigned l = snprintf(ap, component_len, "%f%s", dp[i], sep);
225         if(l >= component_len) {
226             av_free(ap0);
227             return NULL;
228         }
229         ap += l;
230     }
231     ap0[strlen(ap0) - strlen(sep)] = '\0';
232     return ap0;
233 }
234
235 static char *shorts2str(int16_t *sp, int count, const char *sep)
236 {
237     int i;
238     char *ap, *ap0;
239     if (!sep) sep = ", ";
240     ap = av_malloc((5 + strlen(sep)) * count);
241     if (!ap)
242         return NULL;
243     ap0   = ap;
244     ap[0] = '\0';
245     for (i = 0; i < count; i++) {
246         int l = snprintf(ap, 5 + strlen(sep), "%d%s", sp[i], sep);
247         ap += l;
248     }
249     ap0[strlen(ap0) - strlen(sep)] = '\0';
250     return ap0;
251 }
252
253 static int add_doubles_metadata(int count,
254                                 const char *name, const char *sep,
255                                 TiffContext *s)
256 {
257     char *ap;
258     int i;
259     double *dp;
260
261     if (count >= INT_MAX / sizeof(int64_t) || count <= 0)
262         return AVERROR_INVALIDDATA;
263     if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
264         return AVERROR_INVALIDDATA;
265
266     dp = av_malloc(count * sizeof(double));
267     if (!dp)
268         return AVERROR(ENOMEM);
269
270     for (i = 0; i < count; i++)
271         dp[i] = tget_double(&s->gb, s->le);
272     ap = doubles2str(dp, count, sep);
273     av_freep(&dp);
274     if (!ap)
275         return AVERROR(ENOMEM);
276     av_dict_set(&s->picture.metadata, name, ap, AV_DICT_DONT_STRDUP_VAL);
277     return 0;
278 }
279
280 static int add_shorts_metadata(int count, const char *name,
281                                const char *sep, TiffContext *s)
282 {
283     char *ap;
284     int i;
285     int16_t *sp;
286
287     if (count >= INT_MAX / sizeof(int16_t) || count <= 0)
288         return AVERROR_INVALIDDATA;
289     if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int16_t))
290         return AVERROR_INVALIDDATA;
291
292     sp = av_malloc(count * sizeof(int16_t));
293     if (!sp)
294         return AVERROR(ENOMEM);
295
296     for (i = 0; i < count; i++)
297         sp[i] = tget_short(&s->gb, s->le);
298     ap = shorts2str(sp, count, sep);
299     av_freep(&sp);
300     if (!ap)
301         return AVERROR(ENOMEM);
302     av_dict_set(&s->picture.metadata, name, ap, AV_DICT_DONT_STRDUP_VAL);
303     return 0;
304 }
305
306 static int add_string_metadata(int count, const char *name,
307                                TiffContext *s)
308 {
309     char *value;
310
311     if (bytestream2_get_bytes_left(&s->gb) < count)
312         return AVERROR_INVALIDDATA;
313
314     value = av_malloc(count + 1);
315     if (!value)
316         return AVERROR(ENOMEM);
317
318     bytestream2_get_bufferu(&s->gb, value, count);
319     value[count] = 0;
320
321     av_dict_set(&s->picture.metadata, name, value, AV_DICT_DONT_STRDUP_VAL);
322     return 0;
323 }
324
325 static int add_metadata(int count, int type,
326                         const char *name, const char *sep, TiffContext *s)
327 {
328     switch(type) {
329     case TIFF_DOUBLE: return add_doubles_metadata(count, name, sep, s);
330     case TIFF_SHORT : return add_shorts_metadata(count, name, sep, s);
331     case TIFF_STRING: return add_string_metadata(count, name, s);
332     default         : return AVERROR_INVALIDDATA;
333     };
334 }
335
336 #if CONFIG_ZLIB
337 static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
338                            int size)
339 {
340     z_stream zstream = { 0 };
341     int zret;
342
343     zstream.next_in = (uint8_t *)src;
344     zstream.avail_in = size;
345     zstream.next_out = dst;
346     zstream.avail_out = *len;
347     zret = inflateInit(&zstream);
348     if (zret != Z_OK) {
349         av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
350         return zret;
351     }
352     zret = inflate(&zstream, Z_SYNC_FLUSH);
353     inflateEnd(&zstream);
354     *len = zstream.total_out;
355     return zret == Z_STREAM_END ? Z_OK : zret;
356 }
357 #endif
358
359 static void av_always_inline horizontal_fill(unsigned int bpp, uint8_t* dst,
360                                              int usePtr, const uint8_t *src,
361                                              uint8_t c, int width, int offset)
362 {
363     switch (bpp) {
364     case 1:
365         while (--width >= 0) {
366             dst[(width+offset)*8+7] = (usePtr ? src[width] : c)      & 0x1;
367             dst[(width+offset)*8+6] = (usePtr ? src[width] : c) >> 1 & 0x1;
368             dst[(width+offset)*8+5] = (usePtr ? src[width] : c) >> 2 & 0x1;
369             dst[(width+offset)*8+4] = (usePtr ? src[width] : c) >> 3 & 0x1;
370             dst[(width+offset)*8+3] = (usePtr ? src[width] : c) >> 4 & 0x1;
371             dst[(width+offset)*8+2] = (usePtr ? src[width] : c) >> 5 & 0x1;
372             dst[(width+offset)*8+1] = (usePtr ? src[width] : c) >> 6 & 0x1;
373             dst[(width+offset)*8+0] = (usePtr ? src[width] : c) >> 7;
374         }
375         break;
376     case 2:
377         while (--width >= 0) {
378             dst[(width+offset)*4+3] = (usePtr ? src[width] : c) & 0x3;
379             dst[(width+offset)*4+2] = (usePtr ? src[width] : c) >> 2 & 0x3;
380             dst[(width+offset)*4+1] = (usePtr ? src[width] : c) >> 4 & 0x3;
381             dst[(width+offset)*4+0] = (usePtr ? src[width] : c) >> 6;
382         }
383         break;
384     case 4:
385         while (--width >= 0) {
386             dst[(width+offset)*2+1] = (usePtr ? src[width] : c) & 0xF;
387             dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4;
388         }
389         break;
390     default:
391         if (usePtr) {
392             memcpy(dst + offset, src, width);
393         } else {
394             memset(dst + offset, c, width);
395         }
396     }
397 }
398
399 static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
400                              const uint8_t *src, int size, int lines)
401 {
402     int c, line, pixels, code, ret;
403     const uint8_t *ssrc = src;
404     int width = ((s->width * s->bpp) + 7) >> 3;
405
406     if (size <= 0)
407         return AVERROR_INVALIDDATA;
408
409 #if CONFIG_ZLIB
410     if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
411         uint8_t *src2 = NULL, *zbuf;
412         unsigned long outlen;
413         int i, ret;
414         outlen = width * lines;
415         zbuf = av_malloc(outlen);
416         if (!zbuf)
417             return AVERROR(ENOMEM);
418         if (s->fill_order) {
419             src2 = av_malloc((unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE);
420             if (!src2) {
421                 av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
422                 av_free(zbuf);
423                 return AVERROR(ENOMEM);
424             }
425             for (i = 0; i < size; i++)
426                 src2[i] = ff_reverse[src[i]];
427             memset(src2 + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
428             src = src2;
429         }
430         ret = tiff_uncompress(zbuf, &outlen, src, size);
431         if (ret != Z_OK) {
432             av_log(s->avctx, AV_LOG_ERROR,
433                    "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
434                    (unsigned long)width * lines, ret);
435             av_free(src2);
436             av_free(zbuf);
437             return AVERROR_UNKNOWN;
438         }
439         src = zbuf;
440         for (line = 0; line < lines; line++) {
441             if(s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8){
442                 horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
443             }else{
444                 memcpy(dst, src, width);
445             }
446             dst += stride;
447             src += width;
448         }
449         av_free(src2);
450         av_free(zbuf);
451         return 0;
452     }
453 #endif
454     if (s->compr == TIFF_LZW) {
455         if (s->fill_order) {
456             int i;
457             av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size);
458             if (!s->deinvert_buf)
459                 return AVERROR(ENOMEM);
460             for (i = 0; i < size; i++)
461                 s->deinvert_buf[i] = ff_reverse[src[i]];
462             src = s->deinvert_buf;
463             ssrc = src;
464         }
465         if (size > 1 && !src[0] && (src[1]&1)) {
466             av_log(s->avctx, AV_LOG_ERROR, "Old style LZW is unsupported\n");
467         }
468         if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) {
469             av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
470             return ret;
471         }
472     }
473     if (s->compr == TIFF_CCITT_RLE || s->compr == TIFF_G3
474         || s->compr == TIFF_G4) {
475         int i, ret = 0;
476         uint8_t *src2 = av_malloc((unsigned)size +
477                                   FF_INPUT_BUFFER_PADDING_SIZE);
478
479         if (!src2) {
480             av_log(s->avctx, AV_LOG_ERROR,
481                    "Error allocating temporary buffer\n");
482             return AVERROR(ENOMEM);
483         }
484         if (s->fax_opts & 2) {
485             av_log(s->avctx, AV_LOG_ERROR,
486                    "Uncompressed fax mode is not supported (yet)\n");
487             av_free(src2);
488             return AVERROR_INVALIDDATA;
489         }
490         if (!s->fill_order) {
491             memcpy(src2, src, size);
492         } else {
493             for (i = 0; i < size; i++)
494                 src2[i] = ff_reverse[src[i]];
495         }
496         memset(src2 + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
497         switch (s->compr) {
498         case TIFF_CCITT_RLE:
499         case TIFF_G3:
500         case TIFF_G4:
501             ret = ff_ccitt_unpack(s->avctx, src2, size, dst, lines, stride,
502                                   s->compr, s->fax_opts);
503             break;
504         }
505         if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
506             for (line = 0; line < lines; line++) {
507                 horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
508                 dst += stride;
509             }
510         av_free(src2);
511         return ret;
512     }
513     for (line = 0; line < lines; line++) {
514         if (src - ssrc > size) {
515             av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
516             return AVERROR_INVALIDDATA;
517         }
518         switch (s->compr) {
519         case TIFF_RAW:
520             if (ssrc + size - src < width)
521                 return AVERROR_INVALIDDATA;
522             if (!s->fill_order) {
523                 horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
524                                 dst, 1, src, 0, width, 0);
525             } else {
526                 int i;
527                 for (i = 0; i < width; i++)
528                     dst[i] = ff_reverse[src[i]];
529             }
530             src += width;
531             break;
532         case TIFF_PACKBITS:
533             for (pixels = 0; pixels < width;) {
534                 if (ssrc + size - src < 2) {
535                     av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
536                     return AVERROR_INVALIDDATA;
537                 }
538                 code = (int8_t) * src++;
539                 if (code >= 0) {
540                     code++;
541                     if (pixels + code > width) {
542                         av_log(s->avctx, AV_LOG_ERROR,
543                                "Copy went out of bounds\n");
544                         return AVERROR_INVALIDDATA;
545                     }
546                     if (ssrc + size - src < code) {
547                         av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
548                         return AVERROR_INVALIDDATA;
549                     }
550                     horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
551                                     dst, 1, src, 0, code, pixels);
552                     src += code;
553                     pixels += code;
554                 } else if (code != -128) { // -127..-1
555                     code = (-code) + 1;
556                     if (pixels + code > width) {
557                         av_log(s->avctx, AV_LOG_ERROR,
558                                "Run went out of bounds\n");
559                         return AVERROR_INVALIDDATA;
560                     }
561                     c = *src++;
562                     horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
563                                     dst, 0, NULL, c, code, pixels);
564                     pixels += code;
565                 }
566             }
567             break;
568         case TIFF_LZW:
569             pixels = ff_lzw_decode(s->lzw, dst, width);
570             if (pixels < width) {
571                 av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n",
572                        pixels, width);
573                 return AVERROR_INVALIDDATA;
574             }
575             if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
576                 horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
577             break;
578         }
579         dst += stride;
580     }
581     return 0;
582 }
583
584 static int init_image(TiffContext *s)
585 {
586     int i, ret;
587     uint32_t *pal;
588
589     switch (s->bpp * 10 + s->bppcount) {
590     case 11:
591         if (!s->palette_is_set) {
592             s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
593             break;
594         }
595     case 21:
596     case 41:
597     case 81:
598         s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
599         break;
600     case 243:
601         s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
602         break;
603     case 161:
604         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GRAY16LE : AV_PIX_FMT_GRAY16BE;
605         break;
606     case 162:
607         s->avctx->pix_fmt = AV_PIX_FMT_GRAY8A;
608         break;
609     case 324:
610         s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
611         break;
612     case 483:
613         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE : AV_PIX_FMT_RGB48BE;
614         break;
615     case 644:
616         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBA64LE : AV_PIX_FMT_RGBA64BE;
617         break;
618     default:
619         av_log(s->avctx, AV_LOG_ERROR,
620                "This format is not supported (bpp=%d, bppcount=%d)\n",
621                s->bpp, s->bppcount);
622         return AVERROR_INVALIDDATA;
623     }
624     if (s->width != s->avctx->width || s->height != s->avctx->height) {
625         if ((ret = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
626             return ret;
627         avcodec_set_dimensions(s->avctx, s->width, s->height);
628     }
629     if (s->picture.data[0])
630         s->avctx->release_buffer(s->avctx, &s->picture);
631     if ((ret = ff_get_buffer(s->avctx, &s->picture)) < 0) {
632         av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
633         return ret;
634     }
635     if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
636         if (s->palette_is_set) {
637             memcpy(s->picture.data[1], s->palette, sizeof(s->palette));
638         } else {
639             /* make default grayscale pal */
640             pal = (uint32_t *) s->picture.data[1];
641             for (i = 0; i < 1<<s->bpp; i++)
642                 pal[i] = 0xFFU << 24 | i * 255 / ((1<<s->bpp) - 1) * 0x010101;
643         }
644     }
645     return 0;
646 }
647
648 static int tiff_decode_tag(TiffContext *s)
649 {
650     unsigned tag, type, count, off, value = 0;
651     int i, j, k, pos, start;
652     int ret;
653     uint32_t *pal;
654     double *dp;
655
656     tag   = tget_short(&s->gb, s->le);
657     type  = tget_short(&s->gb, s->le);
658     count = tget_long(&s->gb, s->le);
659     off   = tget_long(&s->gb, s->le);
660     start = bytestream2_tell(&s->gb);
661
662     if (type == 0 || type >= FF_ARRAY_ELEMS(type_sizes)) {
663         av_log(s->avctx, AV_LOG_DEBUG, "Unknown tiff type (%u) encountered\n",
664                type);
665         return 0;
666     }
667
668     if (count == 1) {
669         switch (type) {
670         case TIFF_BYTE:
671         case TIFF_SHORT:
672             bytestream2_seek(&s->gb, -4, SEEK_CUR);
673             value = tget(&s->gb, type, s->le);
674             break;
675         case TIFF_LONG:
676             value = off;
677             break;
678         case TIFF_STRING:
679             if (count <= 4) {
680                 bytestream2_seek(&s->gb, -4, SEEK_CUR);
681                 break;
682             }
683         default:
684             value = UINT_MAX;
685             bytestream2_seek(&s->gb, off, SEEK_SET);
686         }
687     } else {
688         if (count <= 4 && type_sizes[type] * count <= 4) {
689             bytestream2_seek(&s->gb, -4, SEEK_CUR);
690         } else {
691             bytestream2_seek(&s->gb, off, SEEK_SET);
692         }
693     }
694
695     switch (tag) {
696     case TIFF_WIDTH:
697         s->width = value;
698         break;
699     case TIFF_HEIGHT:
700         s->height = value;
701         break;
702     case TIFF_BPP:
703         s->bppcount = count;
704         if (count > 4) {
705             av_log(s->avctx, AV_LOG_ERROR,
706                    "This format is not supported (bpp=%d, %d components)\n",
707                    s->bpp, count);
708             return AVERROR_INVALIDDATA;
709         }
710         if (count == 1)
711             s->bpp = value;
712         else {
713             switch (type) {
714             case TIFF_BYTE:
715                 s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) +
716                          ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
717                 break;
718             case TIFF_SHORT:
719             case TIFF_LONG:
720                 s->bpp = 0;
721                 if (bytestream2_get_bytes_left(&s->gb) < type_sizes[type] * count)
722                     return AVERROR_INVALIDDATA;
723                 for (i = 0; i < count; i++)
724                     s->bpp += tget(&s->gb, type, s->le);
725                 break;
726             default:
727                 s->bpp = -1;
728             }
729         }
730         break;
731     case TIFF_SAMPLES_PER_PIXEL:
732         if (count != 1) {
733             av_log(s->avctx, AV_LOG_ERROR,
734                    "Samples per pixel requires a single value, many provided\n");
735             return AVERROR_INVALIDDATA;
736         }
737         if (s->bppcount == 1)
738             s->bpp *= value;
739         s->bppcount = value;
740         break;
741     case TIFF_COMPR:
742         s->compr = value;
743         s->predictor = 0;
744         switch (s->compr) {
745         case TIFF_RAW:
746         case TIFF_PACKBITS:
747         case TIFF_LZW:
748         case TIFF_CCITT_RLE:
749             break;
750         case TIFF_G3:
751         case TIFF_G4:
752             s->fax_opts = 0;
753             break;
754         case TIFF_DEFLATE:
755         case TIFF_ADOBE_DEFLATE:
756 #if CONFIG_ZLIB
757             break;
758 #else
759             av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
760             return AVERROR(ENOSYS);
761 #endif
762         case TIFF_JPEG:
763         case TIFF_NEWJPEG:
764             av_log(s->avctx, AV_LOG_ERROR,
765                    "JPEG compression is not supported\n");
766             return AVERROR_PATCHWELCOME;
767         default:
768             av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
769                    s->compr);
770             return AVERROR_INVALIDDATA;
771         }
772         break;
773     case TIFF_ROWSPERSTRIP:
774         if (type == TIFF_LONG && value == UINT_MAX)
775             value = s->height;
776         if (value < 1) {
777             av_log(s->avctx, AV_LOG_ERROR,
778                    "Incorrect value of rows per strip\n");
779             return AVERROR_INVALIDDATA;
780         }
781         s->rps = value;
782         break;
783     case TIFF_STRIP_OFFS:
784         if (count == 1) {
785             s->strippos = 0;
786             s->stripoff = value;
787         } else
788             s->strippos = off;
789         s->strips = count;
790         if (s->strips == 1)
791             s->rps = s->height;
792         s->sot = type;
793         if (s->strippos > bytestream2_size(&s->gb)) {
794             av_log(s->avctx, AV_LOG_ERROR,
795                    "Tag referencing position outside the image\n");
796             return AVERROR_INVALIDDATA;
797         }
798         break;
799     case TIFF_STRIP_SIZE:
800         if (count == 1) {
801             s->stripsizesoff = 0;
802             s->stripsize = value;
803             s->strips = 1;
804         } else {
805             s->stripsizesoff = off;
806         }
807         s->strips = count;
808         s->sstype = type;
809         if (s->stripsizesoff > bytestream2_size(&s->gb)) {
810             av_log(s->avctx, AV_LOG_ERROR,
811                    "Tag referencing position outside the image\n");
812             return AVERROR_INVALIDDATA;
813         }
814         break;
815     case TIFF_TILE_BYTE_COUNTS:
816     case TIFF_TILE_LENGTH:
817     case TIFF_TILE_OFFSETS:
818     case TIFF_TILE_WIDTH:
819         av_log(s->avctx, AV_LOG_ERROR, "Tiled images are not supported\n");
820         return AVERROR_PATCHWELCOME;
821         break;
822     case TIFF_PREDICTOR:
823         s->predictor = value;
824         break;
825     case TIFF_INVERT:
826         switch (value) {
827         case 0:
828             s->invert = 1;
829             break;
830         case 1:
831             s->invert = 0;
832             break;
833         case 2:
834         case 3:
835             break;
836         default:
837             av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n",
838                    value);
839             return AVERROR_INVALIDDATA;
840         }
841         break;
842     case TIFF_FILL_ORDER:
843         if (value < 1 || value > 2) {
844             av_log(s->avctx, AV_LOG_ERROR,
845                    "Unknown FillOrder value %d, trying default one\n", value);
846             value = 1;
847         }
848         s->fill_order = value - 1;
849         break;
850     case TIFF_PAL:
851         pal = (uint32_t *) s->palette;
852         off = type_sizes[type];
853         if (count / 3 > 256 || bytestream2_get_bytes_left(&s->gb) < count / 3 * off * 3)
854             return AVERROR_INVALIDDATA;
855         off = (type_sizes[type] - 1) << 3;
856         for (k = 2; k >= 0; k--) {
857             for (i = 0; i < count / 3; i++) {
858                 if (k == 2)
859                     pal[i] = 0xFFU << 24;
860                 j =  (tget(&s->gb, type, s->le) >> off) << (k * 8);
861                 pal[i] |= j;
862             }
863         }
864         s->palette_is_set = 1;
865         break;
866     case TIFF_PLANAR:
867         if (value == 2) {
868             av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
869             return AVERROR_PATCHWELCOME;
870         }
871         break;
872     case TIFF_T4OPTIONS:
873         if (s->compr == TIFF_G3)
874             s->fax_opts = value;
875         break;
876     case TIFF_T6OPTIONS:
877         if (s->compr == TIFF_G4)
878             s->fax_opts = value;
879         break;
880 #define ADD_METADATA(count, name, sep)\
881     if ((ret = add_metadata(count, type, name, sep, s)) < 0) {\
882         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\
883         return ret;\
884     }
885     case TIFF_MODEL_PIXEL_SCALE:
886         ADD_METADATA(count, "ModelPixelScaleTag", NULL);
887         break;
888     case TIFF_MODEL_TRANSFORMATION:
889         ADD_METADATA(count, "ModelTransformationTag", NULL);
890         break;
891     case TIFF_MODEL_TIEPOINT:
892         ADD_METADATA(count, "ModelTiepointTag", NULL);
893         break;
894     case TIFF_GEO_KEY_DIRECTORY:
895         ADD_METADATA(1, "GeoTIFF_Version", NULL);
896         ADD_METADATA(2, "GeoTIFF_Key_Revision", ".");
897         s->geotag_count   = tget_short(&s->gb, s->le);
898         if (s->geotag_count > count / 4 - 1) {
899             s->geotag_count = count / 4 - 1;
900             av_log(s->avctx, AV_LOG_WARNING, "GeoTIFF key directory buffer shorter than specified\n");
901         }
902         if (bytestream2_get_bytes_left(&s->gb) < s->geotag_count * sizeof(int16_t) * 4)
903             return -1;
904         s->geotags = av_mallocz(sizeof(TiffGeoTag) * s->geotag_count);
905         if (!s->geotags) {
906             av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
907             return AVERROR(ENOMEM);
908         }
909         for (i = 0; i < s->geotag_count; i++) {
910             s->geotags[i].key    = tget_short(&s->gb, s->le);
911             s->geotags[i].type   = tget_short(&s->gb, s->le);
912             s->geotags[i].count  = tget_short(&s->gb, s->le);
913
914             if (!s->geotags[i].type)
915                 s->geotags[i].val  = get_geokey_val(s->geotags[i].key, tget_short(&s->gb, s->le));
916             else
917                 s->geotags[i].offset = tget_short(&s->gb, s->le);
918         }
919         break;
920     case TIFF_GEO_DOUBLE_PARAMS:
921         if (count >= INT_MAX / sizeof(int64_t))
922             return AVERROR_INVALIDDATA;
923         if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
924             return AVERROR_INVALIDDATA;
925         dp = av_malloc(count * sizeof(double));
926         if (!dp) {
927             av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
928             return AVERROR(ENOMEM);
929         }
930         for (i = 0; i < count; i++)
931             dp[i] = tget_double(&s->gb, s->le);
932         for (i = 0; i < s->geotag_count; i++) {
933             if (s->geotags[i].type == TIFF_GEO_DOUBLE_PARAMS) {
934                 if (s->geotags[i].count == 0
935                     || s->geotags[i].offset + s->geotags[i].count > count) {
936                     av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
937                 } else {
938                     char *ap = doubles2str(&dp[s->geotags[i].offset], s->geotags[i].count, ", ");
939                     if (!ap) {
940                         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
941                         av_freep(&dp);
942                         return AVERROR(ENOMEM);
943                     }
944                     s->geotags[i].val = ap;
945                 }
946             }
947         }
948         av_freep(&dp);
949         break;
950     case TIFF_GEO_ASCII_PARAMS:
951         pos = bytestream2_tell(&s->gb);
952         for (i = 0; i < s->geotag_count; i++) {
953             if (s->geotags[i].type == TIFF_GEO_ASCII_PARAMS) {
954                 if (s->geotags[i].count == 0
955                     || s->geotags[i].offset +  s->geotags[i].count > count) {
956                     av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
957                 } else {
958                     char *ap;
959
960                     bytestream2_seek(&s->gb, pos + s->geotags[i].offset, SEEK_SET);
961                     if (bytestream2_get_bytes_left(&s->gb) < s->geotags[i].count)
962                         return AVERROR_INVALIDDATA;
963                     ap = av_malloc(s->geotags[i].count);
964                     if (!ap) {
965                         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
966                         return AVERROR(ENOMEM);
967                     }
968                     bytestream2_get_bufferu(&s->gb, ap, s->geotags[i].count);
969                     ap[s->geotags[i].count - 1] = '\0'; //replace the "|" delimiter with a 0 byte
970                     s->geotags[i].val = ap;
971                 }
972             }
973         }
974         break;
975     case TIFF_ARTIST:
976         ADD_METADATA(count, "artist", NULL);
977         break;
978     case TIFF_COPYRIGHT:
979         ADD_METADATA(count, "copyright", NULL);
980         break;
981     case TIFF_DATE:
982         ADD_METADATA(count, "date", NULL);
983         break;
984     case TIFF_DOCUMENT_NAME:
985         ADD_METADATA(count, "document_name", NULL);
986         break;
987     case TIFF_HOST_COMPUTER:
988         ADD_METADATA(count, "computer", NULL);
989         break;
990     case TIFF_IMAGE_DESCRIPTION:
991         ADD_METADATA(count, "description", NULL);
992         break;
993     case TIFF_MAKE:
994         ADD_METADATA(count, "make", NULL);
995         break;
996     case TIFF_MODEL:
997         ADD_METADATA(count, "model", NULL);
998         break;
999     case TIFF_PAGE_NAME:
1000         ADD_METADATA(count, "page_name", NULL);
1001         break;
1002     case TIFF_PAGE_NUMBER:
1003         ADD_METADATA(count, "page_number", " / ");
1004         break;
1005     case TIFF_SOFTWARE_NAME:
1006         ADD_METADATA(count, "software", NULL);
1007         break;
1008     default:
1009         av_log(s->avctx, AV_LOG_DEBUG, "Unknown or unsupported tag %d/0X%0X\n",
1010                tag, tag);
1011     }
1012     bytestream2_seek(&s->gb, start, SEEK_SET);
1013     return 0;
1014 }
1015
1016 static int decode_frame(AVCodecContext *avctx,
1017                         void *data, int *got_frame, AVPacket *avpkt)
1018 {
1019     TiffContext *const s = avctx->priv_data;
1020     AVFrame *picture = data;
1021     AVFrame *const p = &s->picture;
1022     unsigned off;
1023     int id, le, ret;
1024     int i, j, entries;
1025     int stride;
1026     unsigned soff, ssize;
1027     uint8_t *dst;
1028     GetByteContext stripsizes;
1029     GetByteContext stripdata;
1030
1031     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
1032
1033     //parse image header
1034     if (avpkt->size < 8)
1035         return AVERROR_INVALIDDATA;
1036     id = bytestream2_get_le16u(&s->gb);
1037     if (id == 0x4949)
1038         le = 1;
1039     else if (id == 0x4D4D)
1040         le = 0;
1041     else {
1042         av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
1043         return AVERROR_INVALIDDATA;
1044     }
1045     s->le = le;
1046     // TIFF_BPP is not a required tag and defaults to 1
1047     s->bppcount = s->bpp = 1;
1048     s->invert = 0;
1049     s->compr = TIFF_RAW;
1050     s->fill_order = 0;
1051     free_geotags(s);
1052     /* metadata has been destroyed from lavc internals, that pointer is not
1053      * valid anymore */
1054     s->picture.metadata = NULL;
1055
1056     // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
1057     // that further identifies the file as a TIFF file"
1058     if (tget_short(&s->gb, le) != 42) {
1059         av_log(avctx, AV_LOG_ERROR,
1060                "The answer to life, universe and everything is not correct!\n");
1061         return AVERROR_INVALIDDATA;
1062     }
1063     // Reset these offsets so we can tell if they were set this frame
1064     s->stripsizesoff = s->strippos = 0;
1065     /* parse image file directory */
1066     off = tget_long(&s->gb, le);
1067     if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
1068         av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
1069         return AVERROR_INVALIDDATA;
1070     }
1071     bytestream2_seek(&s->gb, off, SEEK_SET);
1072     entries = tget_short(&s->gb, le);
1073     if (bytestream2_get_bytes_left(&s->gb) < entries * 12)
1074         return AVERROR_INVALIDDATA;
1075     for (i = 0; i < entries; i++) {
1076         if ((ret = tiff_decode_tag(s)) < 0)
1077             return ret;
1078     }
1079
1080     for (i = 0; i<s->geotag_count; i++) {
1081         const char *keyname = get_geokey_name(s->geotags[i].key);
1082         if (!keyname) {
1083             av_log(avctx, AV_LOG_WARNING, "Unknown or unsupported GeoTIFF key %d\n", s->geotags[i].key);
1084             continue;
1085         }
1086         if (get_geokey_type(s->geotags[i].key) != s->geotags[i].type) {
1087             av_log(avctx, AV_LOG_WARNING, "Type of GeoTIFF key %d is wrong\n", s->geotags[i].key);
1088             continue;
1089         }
1090         ret = av_dict_set(&s->picture.metadata, keyname, s->geotags[i].val, 0);
1091         if (ret<0) {
1092             av_log(avctx, AV_LOG_ERROR, "Writing metadata with key '%s' failed\n", keyname);
1093             return ret;
1094         }
1095     }
1096
1097     if (!s->strippos && !s->stripoff) {
1098         av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
1099         return AVERROR_INVALIDDATA;
1100     }
1101     /* now we have the data and may start decoding */
1102     if ((ret = init_image(s)) < 0)
1103         return ret;
1104
1105     if (s->strips == 1 && !s->stripsize) {
1106         av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
1107         s->stripsize = avpkt->size - s->stripoff;
1108     }
1109     stride = p->linesize[0];
1110     dst = p->data[0];
1111
1112     if (s->stripsizesoff) {
1113         if (s->stripsizesoff >= (unsigned)avpkt->size)
1114             return AVERROR_INVALIDDATA;
1115         bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff, avpkt->size - s->stripsizesoff);
1116     }
1117     if (s->strippos) {
1118         if (s->strippos >= (unsigned)avpkt->size)
1119             return AVERROR_INVALIDDATA;
1120         bytestream2_init(&stripdata, avpkt->data + s->strippos, avpkt->size - s->strippos);
1121     }
1122
1123     if (s->rps <= 0) {
1124         av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
1125         return AVERROR_INVALIDDATA;
1126     }
1127
1128     for (i = 0; i < s->height; i += s->rps) {
1129         if (s->stripsizesoff)
1130             ssize = tget(&stripsizes, s->sstype, s->le);
1131         else
1132             ssize = s->stripsize;
1133
1134         if (s->strippos)
1135             soff = tget(&stripdata, s->sot, s->le);
1136         else
1137             soff = s->stripoff;
1138
1139         if (soff > avpkt->size || ssize > avpkt->size - soff) {
1140             av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
1141             return AVERROR_INVALIDDATA;
1142         }
1143         if (tiff_unpack_strip(s, dst, stride, avpkt->data + soff, ssize,
1144                               FFMIN(s->rps, s->height - i)) < 0)
1145             break;
1146         dst += s->rps * stride;
1147     }
1148     if (s->predictor == 2) {
1149         dst = p->data[0];
1150         soff = s->bpp >> 3;
1151         ssize = s->width * soff;
1152         if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE ||
1153             s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE) {
1154             for (i = 0; i < s->height; i++) {
1155                 for (j = soff; j < ssize; j += 2)
1156                     AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
1157                 dst += stride;
1158             }
1159         } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
1160                    s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) {
1161             for (i = 0; i < s->height; i++) {
1162                 for (j = soff; j < ssize; j += 2)
1163                     AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));
1164                 dst += stride;
1165             }
1166         } else {
1167             for (i = 0; i < s->height; i++) {
1168                 for (j = soff; j < ssize; j++)
1169                     dst[j] += dst[j - soff];
1170                 dst += stride;
1171             }
1172         }
1173     }
1174
1175     if (s->invert) {
1176         dst = s->picture.data[0];
1177         for (i = 0; i < s->height; i++) {
1178             for (j = 0; j < s->picture.linesize[0]; j++)
1179                 dst[j] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255) - dst[j];
1180             dst += s->picture.linesize[0];
1181         }
1182     }
1183     *picture   = s->picture;
1184     *got_frame = 1;
1185
1186     return avpkt->size;
1187 }
1188
1189 static av_cold int tiff_init(AVCodecContext *avctx)
1190 {
1191     TiffContext *s = avctx->priv_data;
1192
1193     s->width = 0;
1194     s->height = 0;
1195     s->avctx = avctx;
1196     avcodec_get_frame_defaults(&s->picture);
1197     avctx->coded_frame = &s->picture;
1198     ff_lzw_decode_open(&s->lzw);
1199     ff_ccitt_unpack_init();
1200
1201     return 0;
1202 }
1203
1204 static av_cold int tiff_end(AVCodecContext *avctx)
1205 {
1206     TiffContext *const s = avctx->priv_data;
1207
1208     free_geotags(s);
1209
1210     ff_lzw_decode_close(&s->lzw);
1211     av_freep(&s->deinvert_buf);
1212     if (s->picture.data[0])
1213         avctx->release_buffer(avctx, &s->picture);
1214     return 0;
1215 }
1216
1217 AVCodec ff_tiff_decoder = {
1218     .name           = "tiff",
1219     .type           = AVMEDIA_TYPE_VIDEO,
1220     .id             = AV_CODEC_ID_TIFF,
1221     .priv_data_size = sizeof(TiffContext),
1222     .init           = tiff_init,
1223     .close          = tiff_end,
1224     .decode         = decode_frame,
1225     .capabilities   = CODEC_CAP_DR1,
1226     .long_name      = NULL_IF_CONFIG_SMALL("TIFF image"),
1227 };