tiff: refactor deflate support in a separate function
[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 static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
146                              const uint8_t *src, int size, int lines)
147 {
148     int c, line, pixels, code, ret;
149     const uint8_t *ssrc = src;
150     int width           = ((s->width * s->bpp) + 7) >> 3;
151
152     if (size <= 0)
153         return AVERROR_INVALIDDATA;
154
155     if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
156 #if CONFIG_ZLIB
157         return tiff_unpack_zlib(s, dst, stride, src, size, width, lines);
158 #else
159         av_log(s->avctx, AV_LOG_ERROR,
160                "zlib support not enabled, "
161                "deflate compression not supported\n");
162         return AVERROR(ENOSYS);
163 #endif
164     }
165     if (s->compr == TIFF_LZW) {
166         if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) {
167             av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
168             return ret;
169         }
170     }
171     if (s->compr == TIFF_CCITT_RLE ||
172         s->compr == TIFF_G3        ||
173         s->compr == TIFF_G4) {
174         int i, ret = 0;
175         uint8_t *src2 = av_malloc((unsigned)size +
176                                   FF_INPUT_BUFFER_PADDING_SIZE);
177
178         if (!src2) {
179             av_log(s->avctx, AV_LOG_ERROR,
180                    "Error allocating temporary buffer\n");
181             return AVERROR(ENOMEM);
182         }
183         if (s->fax_opts & 2) {
184             av_log(s->avctx, AV_LOG_ERROR,
185                    "Uncompressed fax mode is not supported (yet)\n");
186             av_free(src2);
187             return AVERROR_INVALIDDATA;
188         }
189         if (!s->fill_order) {
190             memcpy(src2, src, size);
191         } else {
192             for (i = 0; i < size; i++)
193                 src2[i] = ff_reverse[src[i]];
194         }
195         memset(src2 + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
196         switch (s->compr) {
197         case TIFF_CCITT_RLE:
198         case TIFF_G3:
199         case TIFF_G4:
200             ret = ff_ccitt_unpack(s->avctx, src2, size, dst, lines, stride,
201                                   s->compr, s->fax_opts);
202             break;
203         }
204         av_free(src2);
205         return ret;
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             av_log(s->avctx, AV_LOG_ERROR,
440                    "JPEG compression is not supported\n");
441             return AVERROR_PATCHWELCOME;
442         default:
443             av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
444                    s->compr);
445             return AVERROR_INVALIDDATA;
446         }
447         break;
448     case TIFF_ROWSPERSTRIP:
449         if (type == TIFF_LONG && value == UINT_MAX)
450             value = s->avctx->height;
451         if (value < 1) {
452             av_log(s->avctx, AV_LOG_ERROR,
453                    "Incorrect value of rows per strip\n");
454             return AVERROR_INVALIDDATA;
455         }
456         s->rps = value;
457         break;
458     case TIFF_STRIP_OFFS:
459         if (count == 1) {
460             s->stripdata = NULL;
461             s->stripoff  = value;
462         } else
463             s->stripdata = start + off;
464         s->strips = count;
465         if (s->strips == 1)
466             s->rps = s->height;
467         s->sot = type;
468         if (s->stripdata > end_buf) {
469             av_log(s->avctx, AV_LOG_ERROR,
470                    "Tag referencing position outside the image\n");
471             return AVERROR_INVALIDDATA;
472         }
473         break;
474     case TIFF_STRIP_SIZE:
475         if (count == 1) {
476             s->stripsizes = NULL;
477             s->stripsize  = value;
478             s->strips     = 1;
479         } else {
480             s->stripsizes = start + off;
481         }
482         s->strips = count;
483         s->sstype = type;
484         if (s->stripsizes > end_buf) {
485             av_log(s->avctx, AV_LOG_ERROR,
486                    "Tag referencing position outside the image\n");
487             return AVERROR_INVALIDDATA;
488         }
489         break;
490     case TIFF_PREDICTOR:
491         s->predictor = value;
492         break;
493     case TIFF_INVERT:
494         switch (value) {
495         case 0:
496             s->invert = 1;
497             break;
498         case 1:
499             s->invert = 0;
500             break;
501         case 2:
502         case 3:
503             break;
504         default:
505             av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n",
506                    value);
507             return AVERROR_INVALIDDATA;
508         }
509         break;
510     case TIFF_FILL_ORDER:
511         if (value < 1 || value > 2) {
512             av_log(s->avctx, AV_LOG_ERROR,
513                    "Unknown FillOrder value %d, trying default one\n", value);
514             value = 1;
515         }
516         s->fill_order = value - 1;
517         break;
518     case TIFF_PAL:
519         pal = (uint32_t *) s->palette;
520         off = type_sizes[type];
521         if (count / 3 > 256 || end_buf - buf < count / 3 * off * 3)
522             return AVERROR_INVALIDDATA;
523         rp  = buf;
524         gp  = buf + count / 3 * off;
525         bp  = buf + count / 3 * off * 2;
526         off = (type_sizes[type] - 1) << 3;
527         for (i = 0; i < count / 3; i++) {
528             j      = (tget(&rp, type, s->le) >> off) << 16;
529             j     |= (tget(&gp, type, s->le) >> off) << 8;
530             j     |= tget(&bp, type, s->le) >> off;
531             pal[i] = j;
532         }
533         s->palette_is_set = 1;
534         break;
535     case TIFF_PLANAR:
536         if (value == 2) {
537             av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
538             return AVERROR_PATCHWELCOME;
539         }
540         break;
541     case TIFF_T4OPTIONS:
542         if (s->compr == TIFF_G3)
543             s->fax_opts = value;
544         break;
545     case TIFF_T6OPTIONS:
546         if (s->compr == TIFF_G4)
547             s->fax_opts = value;
548         break;
549     default:
550         av_log(s->avctx, AV_LOG_DEBUG, "Unknown or unsupported tag %d/0X%0X\n",
551                tag, tag);
552     }
553     return 0;
554 }
555
556 static int decode_frame(AVCodecContext *avctx,
557                         void *data, int *got_frame, AVPacket *avpkt)
558 {
559     const uint8_t *buf = avpkt->data;
560     int buf_size       = avpkt->size;
561     TiffContext *const s = avctx->priv_data;
562     AVFrame *const p = data;
563     const uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
564     unsigned off;
565     int id, le, ret;
566     int i, j, entries, stride;
567     unsigned soff, ssize;
568     uint8_t *dst;
569
570     // parse image header
571     if (end_buf - buf < 8)
572         return AVERROR_INVALIDDATA;
573     id   = AV_RL16(buf);
574     buf += 2;
575     if (id == 0x4949)
576         le = 1;
577     else if (id == 0x4D4D)
578         le = 0;
579     else {
580         av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
581         return AVERROR_INVALIDDATA;
582     }
583     s->le         = le;
584     s->invert     = 0;
585     s->compr      = TIFF_RAW;
586     s->fill_order = 0;
587     // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
588     // that further identifies the file as a TIFF file"
589     if (tget_short(&buf, le) != 42) {
590         av_log(avctx, AV_LOG_ERROR,
591                "The answer to life, universe and everything is not correct!\n");
592         return AVERROR_INVALIDDATA;
593     }
594     // Reset these pointers so we can tell if they were set this frame
595     s->stripsizes = s->stripdata = NULL;
596     /* parse image file directory */
597     off = tget_long(&buf, le);
598     if (off >= UINT_MAX - 14 || end_buf - orig_buf < off + 14) {
599         av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
600         return AVERROR_INVALIDDATA;
601     }
602     buf     = orig_buf + off;
603     entries = tget_short(&buf, le);
604     for (i = 0; i < entries; i++) {
605         if ((ret = tiff_decode_tag(s, orig_buf, buf, end_buf)) < 0)
606             return ret;
607         buf += 12;
608     }
609     if (!s->stripdata && !s->stripoff) {
610         av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
611         return AVERROR_INVALIDDATA;
612     }
613     /* now we have the data and may start decoding */
614     if ((ret = init_image(s, p)) < 0)
615         return ret;
616
617     if (s->strips == 1 && !s->stripsize) {
618         av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
619         s->stripsize = buf_size - s->stripoff;
620     }
621     stride = p->linesize[0];
622     dst    = p->data[0];
623     for (i = 0; i < s->height; i += s->rps) {
624         if (s->stripsizes) {
625             if (s->stripsizes >= end_buf)
626                 return AVERROR_INVALIDDATA;
627             ssize = tget(&s->stripsizes, s->sstype, s->le);
628         } else
629             ssize = s->stripsize;
630
631         if (s->stripdata) {
632             if (s->stripdata >= end_buf)
633                 return AVERROR_INVALIDDATA;
634             soff = tget(&s->stripdata, s->sot, s->le);
635         } else
636             soff = s->stripoff;
637
638         if (soff > buf_size || ssize > buf_size - soff) {
639             av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
640             return AVERROR_INVALIDDATA;
641         }
642         if (tiff_unpack_strip(s, dst, stride, orig_buf + soff, ssize,
643                               FFMIN(s->rps, s->height - i)) < 0)
644             break;
645         dst += s->rps * stride;
646     }
647     if (s->predictor == 2) {
648         dst   = p->data[0];
649         soff  = s->bpp >> 3;
650         ssize = s->width * soff;
651         for (i = 0; i < s->height; i++) {
652             for (j = soff; j < ssize; j++)
653                 dst[j] += dst[j - soff];
654             dst += stride;
655         }
656     }
657
658     if (s->invert) {
659         uint8_t *src;
660         int j;
661
662         src = p->data[0];
663         for (j = 0; j < s->height; j++) {
664             for (i = 0; i < p->linesize[0]; i++)
665                 src[i] = 255 - src[i];
666             src += p->linesize[0];
667         }
668     }
669     *got_frame = 1;
670
671     return buf_size;
672 }
673
674 static av_cold int tiff_init(AVCodecContext *avctx)
675 {
676     TiffContext *s = avctx->priv_data;
677
678     s->width  = 0;
679     s->height = 0;
680     s->avctx  = avctx;
681     ff_lzw_decode_open(&s->lzw);
682     ff_ccitt_unpack_init();
683
684     return 0;
685 }
686
687 static av_cold int tiff_end(AVCodecContext *avctx)
688 {
689     TiffContext *const s = avctx->priv_data;
690
691     ff_lzw_decode_close(&s->lzw);
692     return 0;
693 }
694
695 AVCodec ff_tiff_decoder = {
696     .name           = "tiff",
697     .long_name      = NULL_IF_CONFIG_SMALL("TIFF image"),
698     .type           = AVMEDIA_TYPE_VIDEO,
699     .id             = AV_CODEC_ID_TIFF,
700     .priv_data_size = sizeof(TiffContext),
701     .init           = tiff_init,
702     .close          = tiff_end,
703     .decode         = decode_frame,
704     .capabilities   = CODEC_CAP_DR1,
705 };