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