annotate tiff.c @ 4630:1416371d4a6c libavcodec

add avcodec_get_context_defaults2() / avcodec_alloc_context2() which take CodecType as an additional parameter also mark them as NOT part of the public API yet, so we can change their argument to CodecID if we decide to do so
author michael
date Wed, 07 Mar 2007 09:29:44 +0000
parents 48952197d91f
children 0860efc2f02b
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 *
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
21 */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
22 #include "avcodec.h"
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
23 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
24 #include <zlib.h>
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
25 #endif
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
26 #include "lzw.h"
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
27
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
28 /* abridged list of TIFF tags */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
29 enum TiffTags{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
30 TIFF_WIDTH = 0x100,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
31 TIFF_HEIGHT,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
32 TIFF_BPP,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
33 TIFF_COMPR,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
34 TIFF_INVERT = 0x106,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
35 TIFF_STRIP_OFFS = 0x111,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
36 TIFF_ROWSPERSTRIP = 0x116,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
37 TIFF_STRIP_SIZE,
4192
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
38 TIFF_PLANAR = 0x11C,
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
39 TIFF_XPOS = 0x11E,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
40 TIFF_YPOS = 0x11F,
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
41 TIFF_PREDICTOR = 0x13D,
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
42 TIFF_PAL = 0x140
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
43 };
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
44
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
45 enum TiffCompr{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
46 TIFF_RAW = 1,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
47 TIFF_CCITT_RLE,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
48 TIFF_G3,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
49 TIFF_G4,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
50 TIFF_LZW,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
51 TIFF_JPEG,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
52 TIFF_NEWJPEG,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
53 TIFF_ADOBE_DEFLATE,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
54 TIFF_PACKBITS = 0x8005,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
55 TIFF_DEFLATE = 0x80B2
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
56 };
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
57
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
58 enum TiffTypes{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
59 TIFF_BYTE = 1,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
60 TIFF_STRING,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
61 TIFF_SHORT,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
62 TIFF_LONG,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
63 TIFF_LONGLONG
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
64 };
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
65
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
66 /** sizes of various TIFF field types */
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
67 static const int type_sizes[6] = {
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
68 0, 1, 100, 2, 4, 8
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
69 };
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
70
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
71 typedef struct TiffContext {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
72 AVCodecContext *avctx;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
73 AVFrame picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
74
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
75 int width, height;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
76 unsigned int bpp;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
77 int le;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
78 int compr;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
79 int invert;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
80
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
81 int strips, rps;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
82 int sot;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
83 uint8_t* stripdata;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
84 uint8_t* stripsizes;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
85 int stripsize, stripoff;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
86 LZWState *lzw;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
87 } TiffContext;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
88
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
89 static int tget_short(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
90 int v = le ? AV_RL16(*p) : AV_RB16(*p);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
91 *p += 2;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
92 return v;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
93 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
94
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
95 static int tget_long(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
96 int v = le ? AV_RL32(*p) : AV_RB32(*p);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
97 *p += 4;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
98 return v;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
99 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
100
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
101 static int tget(uint8_t **p, int type, int le){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
102 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
103 case TIFF_BYTE : return *(*p)++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
104 case TIFF_SHORT: return tget_short(p, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
105 case TIFF_LONG : return tget_long (p, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
106 default : return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
107 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
108 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
109
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
110 static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, uint8_t *src, int size, int lines){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
111 int c, line, pixels, code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
112 uint8_t *ssrc = src;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
113 int width = s->width * (s->bpp / 8);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
114 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
115 uint8_t *zbuf; unsigned long outlen;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
116
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
117 if(s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
118 outlen = width * lines;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
119 zbuf = av_malloc(outlen);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
120 if(uncompress(zbuf, &outlen, src, size) != Z_OK){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
121 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
122 av_free(zbuf);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
123 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
124 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
125 src = zbuf;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
126 for(line = 0; line < lines; line++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
127 memcpy(dst, src, width);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
128 dst += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
129 src += width;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
130 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
131 av_free(zbuf);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
132 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
133 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
134 #endif
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
135 if(s->compr == TIFF_LZW){
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
136 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
137 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
138 return -1;
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
139 }
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
140 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
141 for(line = 0; line < lines; line++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
142 if(src - ssrc > size){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
143 av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
144 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
145 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
146 switch(s->compr){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
147 case TIFF_RAW:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
148 memcpy(dst, src, s->width * (s->bpp / 8));
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
149 src += s->width * (s->bpp / 8);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
150 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
151 case TIFF_PACKBITS:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
152 for(pixels = 0; pixels < width;){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
153 code = (int8_t)*src++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
154 if(code >= 0){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
155 code++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
156 if(pixels + code > width){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
157 av_log(s->avctx, AV_LOG_ERROR, "Copy went out of bounds\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
158 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
159 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
160 memcpy(dst + pixels, src, code);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
161 src += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
162 pixels += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
163 }else if(code != -128){ // -127..-1
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
164 code = (-code) + 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
165 if(pixels + code > width){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
166 av_log(s->avctx, AV_LOG_ERROR, "Run went out of bounds\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
167 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
168 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
169 c = *src++;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
170 memset(dst + pixels, c, code);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
171 pixels += code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
172 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
173 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
174 break;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
175 case TIFF_LZW:
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
176 pixels = ff_lzw_decode(s->lzw, dst, width);
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
177 if(pixels < width){
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
178 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
179 return -1;
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
180 }
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
181 break;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
182 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
183 dst += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
184 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
185 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
186 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
187
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
188
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
189 static int tiff_decode_tag(TiffContext *s, uint8_t *start, uint8_t *buf, uint8_t *end_buf, AVFrame *pic)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
190 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
191 int tag, type, count, off, value = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
192 uint8_t *src, *dst;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
193 int i, j, ssize, soff, stride;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
194 int *pal, *rp, *gp, *bp;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
195
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
196 tag = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
197 type = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
198 count = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
199 off = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
200
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
201 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
202 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
203 case TIFF_BYTE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
204 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
205 buf -= 4;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
206 value = tget(&buf, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
207 buf = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
208 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
209 case TIFF_LONG:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
210 value = off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
211 buf = NULL;
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 value = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
215 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
216 }
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
217 }else if(type_sizes[type] * count <= 4){
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
218 buf -= 4;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
219 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
220 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
221 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
222
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
223 if(buf && (buf < start || buf > end_buf)){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
224 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
225 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
226 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
227
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
228 switch(tag){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
229 case TIFF_WIDTH:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
230 s->width = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
231 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
232 case TIFF_HEIGHT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
233 s->height = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
234 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
235 case TIFF_BPP:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
236 if(count == 1) s->bpp = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
237 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
238 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
239 case TIFF_BYTE:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
240 s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
241 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
242 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
243 case TIFF_LONG:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
244 s->bpp = 0;
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
245 for(i = 0; i < count; i++) s->bpp += tget(&buf, type, s->le);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
246 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
247 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
248 s->bpp = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
249 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
250 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
251 switch(s->bpp){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
252 case 8:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
253 s->avctx->pix_fmt = PIX_FMT_PAL8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
254 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
255 case 24:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
256 s->avctx->pix_fmt = PIX_FMT_RGB24;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
257 break;
4193
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
258 case 16:
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
259 if(count == 1){
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
260 s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
261 }else{
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
262 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
263 return -1;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
264 }
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
265 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
266 default:
4191
c9867abab7e6 Update error message
kostya
parents: 4190
diff changeset
267 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
268 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
269 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
270 if(s->width != s->avctx->width || s->height != s->avctx->height){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
271 if(avcodec_check_dimensions(s->avctx, s->width, s->height))
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
272 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
273 avcodec_set_dimensions(s->avctx, s->width, s->height);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
274 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
275 if(s->picture.data[0])
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
276 s->avctx->release_buffer(s->avctx, &s->picture);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
277 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
278 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
279 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
280 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
281 if(s->bpp == 8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
282 /* make default grayscale pal */
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
283 pal = s->picture.data[1];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
284 for(i = 0; i < 256; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
285 pal[i] = i * 0x010101;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
286 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
287 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
288 case TIFF_COMPR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
289 s->compr = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
290 switch(s->compr){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
291 case TIFF_RAW:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
292 case TIFF_PACKBITS:
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
293 case TIFF_LZW:
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
294 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
295 case TIFF_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
296 case TIFF_ADOBE_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
297 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
298 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
299 #else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
300 av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
301 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
302 #endif
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
303 case TIFF_G3:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
304 av_log(s->avctx, AV_LOG_ERROR, "CCITT G3 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
305 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
306 case TIFF_G4:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
307 av_log(s->avctx, AV_LOG_ERROR, "CCITT G4 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
308 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
309 case TIFF_CCITT_RLE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
310 av_log(s->avctx, AV_LOG_ERROR, "CCITT RLE compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
311 return -1;
4184
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
312 case TIFF_JPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
313 case TIFF_NEWJPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
314 av_log(s->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
315 return -1;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
316 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
317 av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", s->compr);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
318 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
319 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
320 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
321 case TIFF_ROWSPERSTRIP:
4185
7120f779d313 Rows per strip may be >= height
kostya
parents: 4184
diff changeset
322 if(value < 1){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
323 av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
324 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
325 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
326 s->rps = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
327 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
328 case TIFF_STRIP_OFFS:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
329 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
330 s->stripdata = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
331 s->stripoff = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
332 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
333 s->stripdata = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
334 s->strips = count;
4405
48952197d91f Some TIFFs do not set rows per strip for single strip.
kostya
parents: 4364
diff changeset
335 if(s->strips == 1) s->rps = s->height;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
336 s->sot = type;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
337 if(s->stripdata > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
338 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
339 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
340 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
341 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
342 case TIFF_STRIP_SIZE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
343 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
344 s->stripsizes = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
345 s->stripsize = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
346 s->strips = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
347 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
348 s->stripsizes = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
349 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
350 s->strips = count;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
351 if(s->stripsizes > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
352 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
353 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
354 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
355 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
356 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
357 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
358 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
359 /* now we have the data and may start decoding */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
360 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
361 dst = pic->data[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
362 for(i = 0; i < s->height; i += s->rps){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
363 if(s->stripsizes)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
364 ssize = tget(&s->stripsizes, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
365 else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
366 ssize = s->stripsize;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
367
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
368 if(s->stripdata){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
369 soff = tget(&s->stripdata, s->sot, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
370 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
371 soff = s->stripoff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
372 src = start + soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
373 if(tiff_unpack_strip(s, dst, stride, src, ssize, FFMIN(s->rps, s->height - i)) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
374 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
375 dst += s->rps * stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
376 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
377 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
378 case TIFF_PREDICTOR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
379 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
380 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
381 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
382 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
383 if(value == 2){
4079
00a0b18cfb92 10l predictor should not skip first line
kostya
parents: 4013
diff changeset
384 src = pic->data[0];
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
385 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
386 soff = s->bpp >> 3;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
387 ssize = s->width * soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
388 for(i = 0; i < s->height; i++) {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
389 for(j = soff; j < ssize; j++)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
390 src[j] += src[j - soff];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
391 src += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
392 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
393 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
394 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
395 case TIFF_INVERT:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
396 switch(value){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
397 case 0:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
398 s->invert = 1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
399 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
400 case 1:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
401 s->invert = 0;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
402 break;
4187
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
403 case 2:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
404 case 3:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
405 break;
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
406 default:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
407 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
408 return -1;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
409 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
410 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
411 case TIFF_PAL:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
412 if(s->avctx->pix_fmt != PIX_FMT_PAL8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
413 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
414 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
415 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
416 pal = s->picture.data[1];
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
417 off = type_sizes[type];
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
418 rp = buf;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
419 gp = buf + count / 3 * off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
420 bp = buf + count / 3 * off * 2;
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
421 off = (type_sizes[type] - 1) << 3;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
422 for(i = 0; i < count / 3; i++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
423 j = (tget(&rp, type, s->le) >> off) << 16;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
424 j |= (tget(&gp, type, s->le) >> off) << 8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
425 j |= tget(&bp, type, s->le) >> off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
426 pal[i] = j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
427 }
4192
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
428 break;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
429 case TIFF_PLANAR:
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
430 if(value == 2){
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
431 av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
432 return -1;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
433 }
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
434 break;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
435 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
436 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
437 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
438
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
439 static int decode_frame(AVCodecContext *avctx,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
440 void *data, int *data_size,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
441 uint8_t *buf, int buf_size)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
442 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
443 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
444 AVFrame *picture = data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
445 AVFrame * const p= (AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
446 uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
447 int id, le, off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
448 int i, entries;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
449
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
450 //parse image header
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4193
diff changeset
451 id = AV_RL16(buf); buf += 2;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
452 if(id == 0x4949) le = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
453 else if(id == 0x4D4D) le = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
454 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
455 av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
456 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
457 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
458 s->le = le;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
459 s->invert = 0;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
460 // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
461 // that further identifies the file as a TIFF file"
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
462 if(tget_short(&buf, le) != 42){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
463 av_log(avctx, AV_LOG_ERROR, "The answer to life, universe and everything is not correct!\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
464 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
465 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
466 /* parse image file directory */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
467 off = tget_long(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
468 if(orig_buf + off + 14 >= end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
469 av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
470 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
471 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
472 buf = orig_buf + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
473 entries = tget_short(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
474 for(i = 0; i < entries; i++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
475 if(tiff_decode_tag(s, orig_buf, buf, end_buf, p) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
476 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
477 buf += 12;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
478 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
479
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
480 if(s->invert){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
481 uint8_t *src;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
482 int j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
483
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
484 src = s->picture.data[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
485 for(j = 0; j < s->height; j++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
486 for(i = 0; i < s->picture.linesize[0]; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
487 src[i] = 255 - src[i];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
488 src += s->picture.linesize[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
489 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
490 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
491 *picture= *(AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
492 *data_size = sizeof(AVPicture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
493
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
494 return buf_size;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
495 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
496
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
497 static int tiff_init(AVCodecContext *avctx){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
498 TiffContext *s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
499
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
500 s->width = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
501 s->height = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
502 s->avctx = avctx;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
503 avcodec_get_frame_defaults((AVFrame*)&s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
504 avctx->coded_frame= (AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
505 s->picture.data[0] = NULL;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
506 ff_lzw_decode_open(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
507
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
508 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
509 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
510
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
511 static int tiff_end(AVCodecContext *avctx)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
512 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
513 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
514
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
515 ff_lzw_decode_close(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
516 if(s->picture.data[0])
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
517 avctx->release_buffer(avctx, &s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
518 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
519 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
520
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
521 AVCodec tiff_decoder = {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
522 "tiff",
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
523 CODEC_TYPE_VIDEO,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
524 CODEC_ID_TIFF,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
525 sizeof(TiffContext),
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
526 tiff_init,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
527 NULL,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
528 tiff_end,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
529 decode_frame,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
530 0,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
531 NULL
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
532 };