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