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