]> git.sesse.net Git - ffmpeg/blob - libavcodec/tiff.c
2a48050678bfff3c344779cf9e8476ce72ef1878
[ffmpeg] / libavcodec / tiff.c
1 /*
2  * TIFF image decoder
3  * Copyright (c) 2006 Konstantin Shishkov
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * TIFF image decoder
25  * @author Konstantin Shishkov
26  */
27
28 #include "avcodec.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 "faxcompr.h"
36 #include "libavutil/common.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/imgutils.h"
39
40 typedef struct TiffContext {
41     AVCodecContext *avctx;
42     AVFrame picture;
43
44     int width, height;
45     unsigned int bpp, bppcount;
46     uint32_t palette[256];
47     int palette_is_set;
48     int le;
49     enum TiffCompr compr;
50     int invert;
51     int fax_opts;
52     int predictor;
53     int fill_order;
54
55     int strips, rps, sstype;
56     int sot;
57     const uint8_t *stripdata;
58     const uint8_t *stripsizes;
59     int stripsize, stripoff;
60     LZWState *lzw;
61 } TiffContext;
62
63 static unsigned tget_short(const uint8_t **p, int le)
64 {
65     unsigned v = le ? AV_RL16(*p) : AV_RB16(*p);
66     *p += 2;
67     return v;
68 }
69
70 static unsigned tget_long(const uint8_t **p, int le)
71 {
72     unsigned v = le ? AV_RL32(*p) : AV_RB32(*p);
73     *p += 4;
74     return v;
75 }
76
77 static unsigned tget(const uint8_t **p, int type, int le)
78 {
79     switch (type) {
80     case TIFF_BYTE : return *(*p)++;
81     case TIFF_SHORT: return tget_short(p, le);
82     case TIFF_LONG : return tget_long(p, le);
83     default        : return UINT_MAX;
84     }
85 }
86
87 #if CONFIG_ZLIB
88 static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
89                            int size)
90 {
91     z_stream zstream = { 0 };
92     int zret;
93
94     zstream.next_in = src;
95     zstream.avail_in = size;
96     zstream.next_out = dst;
97     zstream.avail_out = *len;
98     zret = inflateInit(&zstream);
99     if (zret != Z_OK) {
100         av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
101         return zret;
102     }
103     zret = inflate(&zstream, Z_SYNC_FLUSH);
104     inflateEnd(&zstream);
105     *len = zstream.total_out;
106     return zret == Z_STREAM_END ? Z_OK : zret;
107 }
108 #endif
109
110 static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
111                              const uint8_t *src, int size, int lines)
112 {
113     int c, line, pixels, code;
114     const uint8_t *ssrc = src;
115     int width = ((s->width * s->bpp) + 7) >> 3;
116
117     if (size <= 0)
118         return AVERROR_INVALIDDATA;
119
120 #if CONFIG_ZLIB
121     if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
122         uint8_t *zbuf;
123         unsigned long outlen;
124         int ret;
125         outlen = width * lines;
126         zbuf = av_malloc(outlen);
127         if (!zbuf)
128             return AVERROR(ENOMEM);
129         ret = tiff_uncompress(zbuf, &outlen, src, size);
130         if (ret != Z_OK) {
131             av_log(s->avctx, AV_LOG_ERROR,
132                    "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
133                    (unsigned long)width * lines, ret);
134             av_free(zbuf);
135             return -1;
136         }
137         src = zbuf;
138         for (line = 0; line < lines; line++) {
139             memcpy(dst, src, width);
140             dst += stride;
141             src += width;
142         }
143         av_free(zbuf);
144         return 0;
145     }
146 #endif
147     if (s->compr == TIFF_LZW) {
148         if (ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF) < 0) {
149             av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
150             return -1;
151         }
152     }
153     if (s->compr == TIFF_CCITT_RLE || s->compr == TIFF_G3
154         || s->compr == TIFF_G4) {
155         int i, ret = 0;
156         uint8_t *src2 = av_malloc((unsigned)size +
157                                   FF_INPUT_BUFFER_PADDING_SIZE);
158
159         if (!src2) {
160             av_log(s->avctx, AV_LOG_ERROR,
161                    "Error allocating temporary buffer\n");
162             return AVERROR(ENOMEM);
163         }
164         if (s->fax_opts & 2) {
165             av_log(s->avctx, AV_LOG_ERROR,
166                    "Uncompressed fax mode is not supported (yet)\n");
167             av_free(src2);
168             return -1;
169         }
170         if (!s->fill_order) {
171             memcpy(src2, src, size);
172         } else {
173             for (i = 0; i < size; i++)
174                 src2[i] = av_reverse[src[i]];
175         }
176         memset(src2 + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
177         switch (s->compr) {
178         case TIFF_CCITT_RLE:
179         case TIFF_G3:
180         case TIFF_G4:
181             ret = ff_ccitt_unpack(s->avctx, src2, size, dst, lines, stride,
182                                   s->compr, s->fax_opts);
183             break;
184         }
185         av_free(src2);
186         return ret;
187     }
188     for (line = 0; line < lines; line++) {
189         if (src - ssrc > size) {
190             av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
191             return -1;
192         }
193         switch (s->compr) {
194         case TIFF_RAW:
195             if (ssrc + size - src < width)
196                 return AVERROR_INVALIDDATA;
197             if (!s->fill_order) {
198                 memcpy(dst, src, width);
199             } else {
200                 int i;
201                 for (i = 0; i < width; i++)
202                     dst[i] = av_reverse[src[i]];
203             }
204             src += width;
205             break;
206         case TIFF_PACKBITS:
207             for (pixels = 0; pixels < width;) {
208                 code = (int8_t) * src++;
209                 if (code >= 0) {
210                     code++;
211                     if (pixels + code > width) {
212                         av_log(s->avctx, AV_LOG_ERROR,
213                                "Copy went out of bounds\n");
214                         return -1;
215                     }
216                     memcpy(dst + pixels, src, code);
217                     src += code;
218                     pixels += code;
219                 } else if (code != -128) { // -127..-1
220                     code = (-code) + 1;
221                     if (pixels + code > width) {
222                         av_log(s->avctx, AV_LOG_ERROR,
223                                "Run went out of bounds\n");
224                         return -1;
225                     }
226                     c = *src++;
227                     memset(dst + pixels, c, code);
228                     pixels += code;
229                 }
230             }
231             break;
232         case TIFF_LZW:
233             pixels = ff_lzw_decode(s->lzw, dst, width);
234             if (pixels < width) {
235                 av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n",
236                        pixels, width);
237                 return -1;
238             }
239             break;
240         }
241         dst += stride;
242     }
243     return 0;
244 }
245
246 static int init_image(TiffContext *s)
247 {
248     int i, ret;
249     uint32_t *pal;
250
251     switch (s->bpp * 10 + s->bppcount) {
252     case 11:
253         s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
254         break;
255     case 81:
256         s->avctx->pix_fmt = PIX_FMT_PAL8;
257         break;
258     case 243:
259         s->avctx->pix_fmt = PIX_FMT_RGB24;
260         break;
261     case 161:
262         s->avctx->pix_fmt = s->le ? PIX_FMT_GRAY16LE : PIX_FMT_GRAY16BE;
263         break;
264     case 324:
265         s->avctx->pix_fmt = PIX_FMT_RGBA;
266         break;
267     case 483:
268         s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;
269         break;
270     default:
271         av_log(s->avctx, AV_LOG_ERROR,
272                "This format is not supported (bpp=%d, bppcount=%d)\n",
273                s->bpp, s->bppcount);
274         return AVERROR_INVALIDDATA;
275     }
276     if (s->width != s->avctx->width || s->height != s->avctx->height) {
277         if ((ret = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
278             return ret;
279         avcodec_set_dimensions(s->avctx, s->width, s->height);
280     }
281     if (s->picture.data[0])
282         s->avctx->release_buffer(s->avctx, &s->picture);
283     if ((ret = s->avctx->get_buffer(s->avctx, &s->picture)) < 0) {
284         av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
285         return ret;
286     }
287     if (s->avctx->pix_fmt == PIX_FMT_PAL8) {
288         if (s->palette_is_set) {
289             memcpy(s->picture.data[1], s->palette, sizeof(s->palette));
290         } else {
291             /* make default grayscale pal */
292             pal = (uint32_t *) s->picture.data[1];
293             for (i = 0; i < 256; i++)
294                 pal[i] = i * 0x010101;
295         }
296     }
297     return 0;
298 }
299
300 static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
301                            const uint8_t *buf, const uint8_t *end_buf)
302 {
303     unsigned tag, type, count, off, value = 0;
304     int i, j;
305     uint32_t *pal;
306     const uint8_t *rp, *gp, *bp;
307
308     if (end_buf - buf < 12)
309         return -1;
310     tag = tget_short(&buf, s->le);
311     type = tget_short(&buf, s->le);
312     count = tget_long(&buf, s->le);
313     off = tget_long(&buf, s->le);
314
315     if (type == 0 || type >= FF_ARRAY_ELEMS(type_sizes)) {
316         av_log(s->avctx, AV_LOG_DEBUG, "Unknown tiff type (%u) encountered\n",
317                type);
318         return 0;
319     }
320
321     if (count == 1) {
322         switch (type) {
323         case TIFF_BYTE:
324         case TIFF_SHORT:
325             buf -= 4;
326             value = tget(&buf, type, s->le);
327             buf = NULL;
328             break;
329         case TIFF_LONG:
330             value = off;
331             buf = NULL;
332             break;
333         case TIFF_STRING:
334             if (count <= 4) {
335                 buf -= 4;
336                 break;
337             }
338         default:
339             value = UINT_MAX;
340             buf = start + off;
341         }
342     } else {
343         if (count <= 4 && type_sizes[type] * count <= 4) {
344             buf -= 4;
345         } else {
346             buf = start + off;
347         }
348     }
349
350     if (buf && (buf < start || buf > end_buf)) {
351         av_log(s->avctx, AV_LOG_ERROR,
352                "Tag referencing position outside the image\n");
353         return -1;
354     }
355
356     switch (tag) {
357     case TIFF_WIDTH:
358         s->width = value;
359         break;
360     case TIFF_HEIGHT:
361         s->height = value;
362         break;
363     case TIFF_BPP:
364         s->bppcount = count;
365         if (count > 4) {
366             av_log(s->avctx, AV_LOG_ERROR,
367                    "This format is not supported (bpp=%d, %d components)\n",
368                    s->bpp, count);
369             return -1;
370         }
371         if (count == 1)
372             s->bpp = value;
373         else {
374             switch (type) {
375             case TIFF_BYTE:
376                 s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) +
377                          ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
378                 break;
379             case TIFF_SHORT:
380             case TIFF_LONG:
381                 s->bpp = 0;
382                 for (i = 0; i < count && buf < end_buf; i++)
383                     s->bpp += tget(&buf, type, s->le);
384                 break;
385             default:
386                 s->bpp = -1;
387             }
388         }
389         break;
390     case TIFF_SAMPLES_PER_PIXEL:
391         if (count != 1) {
392             av_log(s->avctx, AV_LOG_ERROR,
393                    "Samples per pixel requires a single value, many provided\n");
394             return AVERROR_INVALIDDATA;
395         }
396         if (s->bppcount == 1)
397             s->bpp *= value;
398         s->bppcount = value;
399         break;
400     case TIFF_COMPR:
401         s->compr = value;
402         s->predictor = 0;
403         switch (s->compr) {
404         case TIFF_RAW:
405         case TIFF_PACKBITS:
406         case TIFF_LZW:
407         case TIFF_CCITT_RLE:
408             break;
409         case TIFF_G3:
410         case TIFF_G4:
411             s->fax_opts = 0;
412             break;
413         case TIFF_DEFLATE:
414         case TIFF_ADOBE_DEFLATE:
415 #if CONFIG_ZLIB
416             break;
417 #else
418             av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
419             return -1;
420 #endif
421         case TIFF_JPEG:
422         case TIFF_NEWJPEG:
423             av_log(s->avctx, AV_LOG_ERROR,
424                    "JPEG compression is not supported\n");
425             return -1;
426         default:
427             av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
428                    s->compr);
429             return -1;
430         }
431         break;
432     case TIFF_ROWSPERSTRIP:
433         if (type == TIFF_LONG && value == UINT_MAX)
434             value = s->avctx->height;
435         if (value < 1) {
436             av_log(s->avctx, AV_LOG_ERROR,
437                    "Incorrect value of rows per strip\n");
438             return -1;
439         }
440         s->rps = value;
441         break;
442     case TIFF_STRIP_OFFS:
443         if (count == 1) {
444             s->stripdata = NULL;
445             s->stripoff = value;
446         } else
447             s->stripdata = start + off;
448         s->strips = count;
449         if (s->strips == 1)
450             s->rps = s->height;
451         s->sot = type;
452         if (s->stripdata > end_buf) {
453             av_log(s->avctx, AV_LOG_ERROR,
454                    "Tag referencing position outside the image\n");
455             return -1;
456         }
457         break;
458     case TIFF_STRIP_SIZE:
459         if (count == 1) {
460             s->stripsizes = NULL;
461             s->stripsize = value;
462             s->strips = 1;
463         } else {
464             s->stripsizes = start + off;
465         }
466         s->strips = count;
467         s->sstype = type;
468         if (s->stripsizes > end_buf) {
469             av_log(s->avctx, AV_LOG_ERROR,
470                    "Tag referencing position outside the image\n");
471             return -1;
472         }
473         break;
474     case TIFF_PREDICTOR:
475         s->predictor = value;
476         break;
477     case TIFF_INVERT:
478         switch (value) {
479         case 0:
480             s->invert = 1;
481             break;
482         case 1:
483             s->invert = 0;
484             break;
485         case 2:
486         case 3:
487             break;
488         default:
489             av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n",
490                    value);
491             return -1;
492         }
493         break;
494     case TIFF_FILL_ORDER:
495         if (value < 1 || value > 2) {
496             av_log(s->avctx, AV_LOG_ERROR,
497                    "Unknown FillOrder value %d, trying default one\n", value);
498             value = 1;
499         }
500         s->fill_order = value - 1;
501         break;
502     case TIFF_PAL:
503         pal = (uint32_t *) s->palette;
504         off = type_sizes[type];
505         if (count / 3 > 256 || end_buf - buf < count / 3 * off * 3)
506             return -1;
507         rp = buf;
508         gp = buf + count / 3 * off;
509         bp = buf + count / 3 * off * 2;
510         off = (type_sizes[type] - 1) << 3;
511         for (i = 0; i < count / 3; i++) {
512             j  = (tget(&rp, type, s->le) >> off) << 16;
513             j |= (tget(&gp, type, s->le) >> off) << 8;
514             j |=  tget(&bp, type, s->le) >> off;
515             pal[i] = j;
516         }
517         s->palette_is_set = 1;
518         break;
519     case TIFF_PLANAR:
520         if (value == 2) {
521             av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
522             return -1;
523         }
524         break;
525     case TIFF_T4OPTIONS:
526         if (s->compr == TIFF_G3)
527             s->fax_opts = value;
528         break;
529     case TIFF_T6OPTIONS:
530         if (s->compr == TIFF_G4)
531             s->fax_opts = value;
532         break;
533     default:
534         av_log(s->avctx, AV_LOG_DEBUG, "Unknown or unsupported tag %d/0X%0X\n",
535                tag, tag);
536     }
537     return 0;
538 }
539
540 static int decode_frame(AVCodecContext *avctx,
541                         void *data, int *data_size, AVPacket *avpkt)
542 {
543     const uint8_t *buf = avpkt->data;
544     int buf_size = avpkt->size;
545     TiffContext *const s = avctx->priv_data;
546     AVFrame *picture = data;
547     AVFrame *const p = &s->picture;
548     const uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
549     unsigned off;
550     int id, le, ret;
551     int i, j, entries;
552     int stride;
553     unsigned soff, ssize;
554     uint8_t *dst;
555
556     //parse image header
557     if (end_buf - buf < 8)
558         return AVERROR_INVALIDDATA;
559     id = AV_RL16(buf);
560     buf += 2;
561     if (id == 0x4949)
562         le = 1;
563     else if (id == 0x4D4D)
564         le = 0;
565     else {
566         av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
567         return -1;
568     }
569     s->le = le;
570     s->invert = 0;
571     s->compr = TIFF_RAW;
572     s->fill_order = 0;
573     // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
574     // that further identifies the file as a TIFF file"
575     if (tget_short(&buf, le) != 42) {
576         av_log(avctx, AV_LOG_ERROR,
577                "The answer to life, universe and everything is not correct!\n");
578         return -1;
579     }
580     // Reset these pointers so we can tell if they were set this frame
581     s->stripsizes = s->stripdata = NULL;
582     /* parse image file directory */
583     off = tget_long(&buf, le);
584     if (off >= UINT_MAX - 14 || end_buf - orig_buf < off + 14) {
585         av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
586         return AVERROR_INVALIDDATA;
587     }
588     buf = orig_buf + off;
589     entries = tget_short(&buf, le);
590     for (i = 0; i < entries; i++) {
591         if (tiff_decode_tag(s, orig_buf, buf, end_buf) < 0)
592             return -1;
593         buf += 12;
594     }
595     if (!s->stripdata && !s->stripoff) {
596         av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
597         return -1;
598     }
599     /* now we have the data and may start decoding */
600     if ((ret = init_image(s)) < 0)
601         return ret;
602
603     if (s->strips == 1 && !s->stripsize) {
604         av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
605         s->stripsize = buf_size - s->stripoff;
606     }
607     stride = p->linesize[0];
608     dst = p->data[0];
609     for (i = 0; i < s->height; i += s->rps) {
610         if (s->stripsizes) {
611             if (s->stripsizes >= end_buf)
612                 return AVERROR_INVALIDDATA;
613             ssize = tget(&s->stripsizes, s->sstype, s->le);
614         } else
615             ssize = s->stripsize;
616
617         if (s->stripdata) {
618             if (s->stripdata >= end_buf)
619                 return AVERROR_INVALIDDATA;
620             soff = tget(&s->stripdata, s->sot, s->le);
621         } else
622             soff = s->stripoff;
623
624         if (soff > buf_size || ssize > buf_size - soff) {
625             av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
626             return -1;
627         }
628         if (tiff_unpack_strip(s, dst, stride, orig_buf + soff, ssize,
629                               FFMIN(s->rps, s->height - i)) < 0)
630             break;
631         dst += s->rps * stride;
632     }
633     if (s->predictor == 2) {
634         dst = p->data[0];
635         soff = s->bpp >> 3;
636         ssize = s->width * soff;
637         for (i = 0; i < s->height; i++) {
638             for (j = soff; j < ssize; j++)
639                 dst[j] += dst[j - soff];
640             dst += stride;
641         }
642     }
643
644     if (s->invert) {
645         uint8_t *src;
646         int j;
647
648         src = s->picture.data[0];
649         for (j = 0; j < s->height; j++) {
650             for (i = 0; i < s->picture.linesize[0]; i++)
651                 src[i] = 255 - src[i];
652             src += s->picture.linesize[0];
653         }
654     }
655     *picture   = s->picture;
656     *data_size = sizeof(AVPicture);
657
658     return buf_size;
659 }
660
661 static av_cold int tiff_init(AVCodecContext *avctx)
662 {
663     TiffContext *s = avctx->priv_data;
664
665     s->width = 0;
666     s->height = 0;
667     s->avctx = avctx;
668     avcodec_get_frame_defaults(&s->picture);
669     avctx->coded_frame = &s->picture;
670     ff_lzw_decode_open(&s->lzw);
671     ff_ccitt_unpack_init();
672
673     return 0;
674 }
675
676 static av_cold int tiff_end(AVCodecContext *avctx)
677 {
678     TiffContext *const s = avctx->priv_data;
679
680     ff_lzw_decode_close(&s->lzw);
681     if (s->picture.data[0])
682         avctx->release_buffer(avctx, &s->picture);
683     return 0;
684 }
685
686 AVCodec ff_tiff_decoder = {
687     .name           = "tiff",
688     .type           = AVMEDIA_TYPE_VIDEO,
689     .id             = AV_CODEC_ID_TIFF,
690     .priv_data_size = sizeof(TiffContext),
691     .init           = tiff_init,
692     .close          = tiff_end,
693     .decode         = decode_frame,
694     .capabilities   = CODEC_CAP_DR1,
695     .long_name      = NULL_IF_CONFIG_SMALL("TIFF image"),
696 };