annotate tiff.c @ 7855:9a135b6a1dc7 libavcodec

Correct order of parsing for pulse scalefactor band and offset to match the specification. Patch by Alex Converse (alex converse gmail com)
author superdump
date Sat, 13 Sep 2008 18:47:43 +0000
parents e943e1409077
children 3bbfd02865d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
1 /*
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
2 * TIFF image decoder
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
4 *
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
6 *
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
11 *
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
16 *
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
20 */
4782
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
21
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
22 /**
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
23 * TIFF image decoder
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
24 * @file tiff.c
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
25 * @author Konstantin Shishkov
bca8924ed36c Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents: 4774
diff changeset
26 */
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
27 #include "avcodec.h"
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
28 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
29 #include <zlib.h>
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
30 #endif
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
31 #include "lzw.h"
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4405
diff changeset
32 #include "tiff.h"
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
33
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
34
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
35 typedef struct TiffContext {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
36 AVCodecContext *avctx;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
37 AVFrame picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
38
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
39 int width, height;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
40 unsigned int bpp;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
41 int le;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
42 int compr;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
43 int invert;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
44
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
45 int strips, rps;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
46 int sot;
6256
michael
parents: 5962
diff changeset
47 const uint8_t* stripdata;
michael
parents: 5962
diff changeset
48 const uint8_t* stripsizes;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
49 int stripsize, stripoff;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
50 LZWState *lzw;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
51 } TiffContext;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
52
6256
michael
parents: 5962
diff changeset
53 static int tget_short(const uint8_t **p, int le){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4193
diff changeset
54 int v = le ? AV_RL16(*p) : AV_RB16(*p);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
55 *p += 2;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
56 return v;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
57 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
58
6256
michael
parents: 5962
diff changeset
59 static int tget_long(const uint8_t **p, int le){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4193
diff changeset
60 int v = le ? AV_RL32(*p) : AV_RB32(*p);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
61 *p += 4;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
62 return v;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
63 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
64
6256
michael
parents: 5962
diff changeset
65 static int tget(const uint8_t **p, int type, int le){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
66 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
67 case TIFF_BYTE : return *(*p)++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
68 case TIFF_SHORT: return tget_short(p, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
69 case TIFF_LONG : return tget_long (p, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
70 default : return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
71 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
72 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
73
6256
michael
parents: 5962
diff changeset
74 static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uint8_t *src, int size, int lines){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
75 int c, line, pixels, code;
6256
michael
parents: 5962
diff changeset
76 const uint8_t *ssrc = src;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
77 int width = s->width * (s->bpp / 8);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
78 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
79 uint8_t *zbuf; unsigned long outlen;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
80
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
81 if(s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
82 outlen = width * lines;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
83 zbuf = av_malloc(outlen);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
84 if(uncompress(zbuf, &outlen, src, size) != Z_OK){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
85 av_log(s->avctx, AV_LOG_ERROR, "Uncompressing failed (%lu of %lu)\n", outlen, (unsigned long)width * lines);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
86 av_free(zbuf);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
87 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
88 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
89 src = zbuf;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
90 for(line = 0; line < lines; line++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
91 memcpy(dst, src, width);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
92 dst += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
93 src += width;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
94 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
95 av_free(zbuf);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
96 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
97 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
98 #endif
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
99 if(s->compr == TIFF_LZW){
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
100 if(ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF) < 0){
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
101 av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
102 return -1;
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
103 }
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
104 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
105 for(line = 0; line < lines; line++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
106 if(src - ssrc > size){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
107 av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
108 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
109 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
110 switch(s->compr){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
111 case TIFF_RAW:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
112 memcpy(dst, src, s->width * (s->bpp / 8));
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
113 src += s->width * (s->bpp / 8);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
114 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
115 case TIFF_PACKBITS:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
116 for(pixels = 0; pixels < width;){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
117 code = (int8_t)*src++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
118 if(code >= 0){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
119 code++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
120 if(pixels + code > width){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
121 av_log(s->avctx, AV_LOG_ERROR, "Copy went out of bounds\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
122 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
123 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
124 memcpy(dst + pixels, src, code);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
125 src += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
126 pixels += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
127 }else if(code != -128){ // -127..-1
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
128 code = (-code) + 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
129 if(pixels + code > width){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
130 av_log(s->avctx, AV_LOG_ERROR, "Run went out of bounds\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
131 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
132 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
133 c = *src++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
134 memset(dst + pixels, c, code);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
135 pixels += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
136 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
137 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
138 break;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
139 case TIFF_LZW:
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
140 pixels = ff_lzw_decode(s->lzw, dst, width);
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
141 if(pixels < width){
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
142 av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n", pixels, width);
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
143 return -1;
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
144 }
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
145 break;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
146 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
147 dst += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
148 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
149 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
150 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
151
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
152
6256
michael
parents: 5962
diff changeset
153 static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf, AVFrame *pic)
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
154 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
155 int tag, type, count, off, value = 0;
6256
michael
parents: 5962
diff changeset
156 const uint8_t *src;
michael
parents: 5962
diff changeset
157 uint8_t *dst;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
158 int i, j, ssize, soff, stride;
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
159 uint32_t *pal;
6256
michael
parents: 5962
diff changeset
160 const uint8_t *rp, *gp, *bp;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
161
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
162 tag = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
163 type = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
164 count = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
165 off = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
166
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
167 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
168 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
169 case TIFF_BYTE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
170 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
171 buf -= 4;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
172 value = tget(&buf, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
173 buf = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
174 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
175 case TIFF_LONG:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
176 value = off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
177 buf = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
178 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
179 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
180 value = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
181 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
182 }
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
183 }else if(type_sizes[type] * count <= 4){
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
184 buf -= 4;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
185 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
186 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
187 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
188
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
189 if(buf && (buf < start || buf > end_buf)){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
190 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
191 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
192 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
193
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
194 switch(tag){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
195 case TIFF_WIDTH:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
196 s->width = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
197 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
198 case TIFF_HEIGHT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
199 s->height = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
200 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
201 case TIFF_BPP:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
202 if(count == 1) s->bpp = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
203 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
204 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
205 case TIFF_BYTE:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
206 s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
207 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
208 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
209 case TIFF_LONG:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
210 s->bpp = 0;
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
211 for(i = 0; i < count; i++) s->bpp += tget(&buf, type, s->le);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
212 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
213 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
214 s->bpp = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
215 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
216 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
217 switch(s->bpp){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
218 case 8:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
219 s->avctx->pix_fmt = PIX_FMT_PAL8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
220 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
221 case 24:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
222 s->avctx->pix_fmt = PIX_FMT_RGB24;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
223 break;
4193
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
224 case 16:
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
225 if(count == 1){
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
226 s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
227 }else{
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
228 av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%i)\n", s->bpp);
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
229 return -1;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
230 }
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
231 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
232 default:
4191
c9867abab7e6 Update error message
kostya
parents: 4190
diff changeset
233 av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%i)\n", s->bpp);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
234 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
235 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
236 if(s->width != s->avctx->width || s->height != s->avctx->height){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
237 if(avcodec_check_dimensions(s->avctx, s->width, s->height))
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
238 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
239 avcodec_set_dimensions(s->avctx, s->width, s->height);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
240 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
241 if(s->picture.data[0])
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
242 s->avctx->release_buffer(s->avctx, &s->picture);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
243 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
244 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
245 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
246 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
247 if(s->bpp == 8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
248 /* make default grayscale pal */
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
249 pal = (uint32_t *) s->picture.data[1];
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
250 for(i = 0; i < 256; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
251 pal[i] = i * 0x010101;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
252 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
253 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
254 case TIFF_COMPR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
255 s->compr = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
256 switch(s->compr){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
257 case TIFF_RAW:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
258 case TIFF_PACKBITS:
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
259 case TIFF_LZW:
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
260 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
261 case TIFF_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
262 case TIFF_ADOBE_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
263 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
264 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
265 #else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
266 av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
267 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
268 #endif
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
269 case TIFF_G3:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
270 av_log(s->avctx, AV_LOG_ERROR, "CCITT G3 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
271 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
272 case TIFF_G4:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
273 av_log(s->avctx, AV_LOG_ERROR, "CCITT G4 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
274 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
275 case TIFF_CCITT_RLE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
276 av_log(s->avctx, AV_LOG_ERROR, "CCITT RLE compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
277 return -1;
4184
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
278 case TIFF_JPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
279 case TIFF_NEWJPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
280 av_log(s->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
281 return -1;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
282 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
283 av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", s->compr);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
284 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
285 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
286 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
287 case TIFF_ROWSPERSTRIP:
4185
7120f779d313 Rows per strip may be >= height
kostya
parents: 4184
diff changeset
288 if(value < 1){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
289 av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
290 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
291 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
292 s->rps = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
293 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
294 case TIFF_STRIP_OFFS:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
295 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
296 s->stripdata = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
297 s->stripoff = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
298 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
299 s->stripdata = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
300 s->strips = count;
4405
48952197d91f Some TIFFs do not set rows per strip for single strip.
kostya
parents: 4364
diff changeset
301 if(s->strips == 1) s->rps = s->height;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
302 s->sot = type;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
303 if(s->stripdata > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
304 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
305 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
306 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
307 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
308 case TIFF_STRIP_SIZE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
309 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
310 s->stripsizes = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
311 s->stripsize = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
312 s->strips = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
313 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
314 s->stripsizes = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
315 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
316 s->strips = count;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
317 if(s->stripsizes > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
318 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
319 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
320 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
321 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
322 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
323 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
324 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
325 /* now we have the data and may start decoding */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
326 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
327 dst = pic->data[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
328 for(i = 0; i < s->height; i += s->rps){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
329 if(s->stripsizes)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
330 ssize = tget(&s->stripsizes, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
331 else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
332 ssize = s->stripsize;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
333
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
334 if(s->stripdata){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
335 soff = tget(&s->stripdata, s->sot, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
336 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
337 soff = s->stripoff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
338 src = start + soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
339 if(tiff_unpack_strip(s, dst, stride, src, ssize, FFMIN(s->rps, s->height - i)) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
340 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
341 dst += s->rps * stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
342 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
343 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
344 case TIFF_PREDICTOR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
345 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
346 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
347 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
348 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
349 if(value == 2){
6256
michael
parents: 5962
diff changeset
350 dst = pic->data[0];
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
351 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
352 soff = s->bpp >> 3;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
353 ssize = s->width * soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
354 for(i = 0; i < s->height; i++) {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
355 for(j = soff; j < ssize; j++)
6256
michael
parents: 5962
diff changeset
356 dst[j] += dst[j - soff];
michael
parents: 5962
diff changeset
357 dst += stride;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
358 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
359 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
360 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
361 case TIFF_INVERT:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
362 switch(value){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
363 case 0:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
364 s->invert = 1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
365 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
366 case 1:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
367 s->invert = 0;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
368 break;
4187
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
369 case 2:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
370 case 3:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
371 break;
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
372 default:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
373 av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", value);
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
374 return -1;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
375 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
376 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
377 case TIFF_PAL:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
378 if(s->avctx->pix_fmt != PIX_FMT_PAL8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
379 av_log(s->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n");
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
380 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
381 }
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
382 pal = (uint32_t *) s->picture.data[1];
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
383 off = type_sizes[type];
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
384 rp = buf;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
385 gp = buf + count / 3 * off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
386 bp = buf + count / 3 * off * 2;
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
387 off = (type_sizes[type] - 1) << 3;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
388 for(i = 0; i < count / 3; i++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
389 j = (tget(&rp, type, s->le) >> off) << 16;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
390 j |= (tget(&gp, type, s->le) >> off) << 8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
391 j |= tget(&bp, type, s->le) >> off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
392 pal[i] = j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
393 }
4192
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
394 break;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
395 case TIFF_PLANAR:
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
396 if(value == 2){
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
397 av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
398 return -1;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
399 }
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
400 break;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
401 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
402 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
403 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
404
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
405 static int decode_frame(AVCodecContext *avctx,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
406 void *data, int *data_size,
6256
michael
parents: 5962
diff changeset
407 const uint8_t *buf, int buf_size)
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
408 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
409 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
410 AVFrame *picture = data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
411 AVFrame * const p= (AVFrame*)&s->picture;
6256
michael
parents: 5962
diff changeset
412 const uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
413 int id, le, off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
414 int i, entries;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
415
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
416 //parse image header
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4193
diff changeset
417 id = AV_RL16(buf); buf += 2;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
418 if(id == 0x4949) le = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
419 else if(id == 0x4D4D) le = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
420 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
421 av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
422 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
423 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
424 s->le = le;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
425 s->invert = 0;
5962
a6c9aa23d379 TIFF may omit compression tag.
kostya
parents: 5261
diff changeset
426 s->compr = TIFF_RAW;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
427 // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
428 // that further identifies the file as a TIFF file"
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
429 if(tget_short(&buf, le) != 42){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
430 av_log(avctx, AV_LOG_ERROR, "The answer to life, universe and everything is not correct!\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
431 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
432 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
433 /* parse image file directory */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
434 off = tget_long(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
435 if(orig_buf + off + 14 >= end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
436 av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
437 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
438 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
439 buf = orig_buf + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
440 entries = tget_short(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
441 for(i = 0; i < entries; i++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
442 if(tiff_decode_tag(s, orig_buf, buf, end_buf, p) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
443 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
444 buf += 12;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
445 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
446
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
447 if(s->invert){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
448 uint8_t *src;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
449 int j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
450
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
451 src = s->picture.data[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
452 for(j = 0; j < s->height; j++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
453 for(i = 0; i < s->picture.linesize[0]; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
454 src[i] = 255 - src[i];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
455 src += s->picture.linesize[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
456 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
457 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
458 *picture= *(AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
459 *data_size = sizeof(AVPicture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
460
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
461 return buf_size;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
462 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
463
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6256
diff changeset
464 static av_cold int tiff_init(AVCodecContext *avctx){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
465 TiffContext *s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
466
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
467 s->width = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
468 s->height = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
469 s->avctx = avctx;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
470 avcodec_get_frame_defaults((AVFrame*)&s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
471 avctx->coded_frame= (AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
472 s->picture.data[0] = NULL;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
473 ff_lzw_decode_open(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
474
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
475 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
476 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
477
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6256
diff changeset
478 static av_cold int tiff_end(AVCodecContext *avctx)
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
479 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
480 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
481
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
482 ff_lzw_decode_close(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
483 if(s->picture.data[0])
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
484 avctx->release_buffer(avctx, &s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
485 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
486 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
487
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
488 AVCodec tiff_decoder = {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
489 "tiff",
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
490 CODEC_TYPE_VIDEO,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
491 CODEC_ID_TIFF,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
492 sizeof(TiffContext),
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
493 tiff_init,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
494 NULL,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
495 tiff_end,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
496 decode_frame,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
497 0,
6722
6eeb19edcee3 Add long names to some AVCodec declarations.
diego
parents: 6517
diff changeset
498 NULL,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6722
diff changeset
499 .long_name = NULL_IF_CONFIG_SMALL("TIFF image"),
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
500 };