annotate tiff.c @ 6047:2f9c17454842 libavcodec

Add option for user to scale the amount of dynamic range compression which is applied by the audio decoder, and use that option in the AC3 decoder.
author jbr
date Thu, 20 Dec 2007 00:55:08 +0000
parents a6c9aa23d379
children e7c178d397ea
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;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
47 uint8_t* stripdata;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
48 uint8_t* stripsizes;
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
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
53 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
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
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
59 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
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
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
65 static int tget(uint8_t **p, int type, int le){
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
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
74 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
75 int c, line, pixels, code;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
76 uint8_t *ssrc = src;
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
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
153 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
154 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
155 int tag, type, count, off, value = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
156 uint8_t *src, *dst;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
157 int i, j, ssize, soff, stride;
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
158 uint32_t *pal;
5257
f2eaf5afe6ae kill warnings
mru
parents: 5215
diff changeset
159 uint8_t *rp, *gp, *bp;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
160
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
161 tag = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
162 type = tget_short(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
163 count = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
164 off = tget_long(&buf, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
165
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
166 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
167 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
168 case TIFF_BYTE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
169 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
170 buf -= 4;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
171 value = tget(&buf, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
172 buf = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
173 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
174 case TIFF_LONG:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
175 value = off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
176 buf = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
177 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
178 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
179 value = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
180 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
181 }
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
182 }else if(type_sizes[type] * count <= 4){
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
183 buf -= 4;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
184 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
185 buf = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
186 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
187
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
188 if(buf && (buf < start || buf > end_buf)){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
189 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
190 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
191 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
192
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
193 switch(tag){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
194 case TIFF_WIDTH:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
195 s->width = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
196 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
197 case TIFF_HEIGHT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
198 s->height = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
199 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
200 case TIFF_BPP:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
201 if(count == 1) s->bpp = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
202 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
203 switch(type){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
204 case TIFF_BYTE:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
205 s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
206 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
207 case TIFF_SHORT:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
208 case TIFF_LONG:
4183
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
209 s->bpp = 0;
c70922cdf2ee Correctly detect 4-component images
kostya
parents: 4080
diff changeset
210 for(i = 0; i < count; i++) s->bpp += tget(&buf, type, s->le);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
211 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
212 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
213 s->bpp = -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
214 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
215 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
216 switch(s->bpp){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
217 case 8:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
218 s->avctx->pix_fmt = PIX_FMT_PAL8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
219 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
220 case 24:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
221 s->avctx->pix_fmt = PIX_FMT_RGB24;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
222 break;
4193
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
223 case 16:
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
224 if(count == 1){
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
225 s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
226 }else{
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
227 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
228 return -1;
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
229 }
cdefe220b007 Support for 16-bit grayscale
kostya
parents: 4192
diff changeset
230 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
231 default:
4191
c9867abab7e6 Update error message
kostya
parents: 4190
diff changeset
232 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
233 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
234 }
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
235 if(s->width != s->avctx->width || s->height != s->avctx->height){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
236 if(avcodec_check_dimensions(s->avctx, s->width, s->height))
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
237 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
238 avcodec_set_dimensions(s->avctx, s->width, s->height);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
239 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
240 if(s->picture.data[0])
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
241 s->avctx->release_buffer(s->avctx, &s->picture);
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
242 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
243 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
244 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
245 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
246 if(s->bpp == 8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
247 /* make default grayscale pal */
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
248 pal = (uint32_t *) s->picture.data[1];
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
249 for(i = 0; i < 256; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
250 pal[i] = i * 0x010101;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
251 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
252 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
253 case TIFF_COMPR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
254 s->compr = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
255 switch(s->compr){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
256 case TIFF_RAW:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
257 case TIFF_PACKBITS:
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
258 case TIFF_LZW:
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
259 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
260 case TIFF_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
261 case TIFF_ADOBE_DEFLATE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
262 #ifdef CONFIG_ZLIB
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
263 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
264 #else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
265 av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
266 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
267 #endif
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
268 case TIFF_G3:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
269 av_log(s->avctx, AV_LOG_ERROR, "CCITT G3 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
270 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
271 case TIFF_G4:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
272 av_log(s->avctx, AV_LOG_ERROR, "CCITT G4 compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
273 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
274 case TIFF_CCITT_RLE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
275 av_log(s->avctx, AV_LOG_ERROR, "CCITT RLE compression is not supported\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
276 return -1;
4184
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
277 case TIFF_JPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
278 case TIFF_NEWJPEG:
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
279 av_log(s->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");
cfaa5d84641e Warn about JPEG in TIFF
kostya
parents: 4183
diff changeset
280 return -1;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
281 default:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
282 av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", s->compr);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
283 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
284 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
285 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
286 case TIFF_ROWSPERSTRIP:
4185
7120f779d313 Rows per strip may be >= height
kostya
parents: 4184
diff changeset
287 if(value < 1){
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
288 av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
289 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
290 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
291 s->rps = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
292 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
293 case TIFF_STRIP_OFFS:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
294 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
295 s->stripdata = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
296 s->stripoff = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
297 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
298 s->stripdata = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
299 s->strips = count;
4405
48952197d91f Some TIFFs do not set rows per strip for single strip.
kostya
parents: 4364
diff changeset
300 if(s->strips == 1) s->rps = s->height;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
301 s->sot = type;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
302 if(s->stripdata > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
303 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
304 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
305 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
306 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
307 case TIFF_STRIP_SIZE:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
308 if(count == 1){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
309 s->stripsizes = NULL;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
310 s->stripsize = value;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
311 s->strips = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
312 }else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
313 s->stripsizes = start + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
314 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
315 s->strips = count;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
316 if(s->stripsizes > end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
317 av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");
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 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
321 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
322 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
323 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
324 /* now we have the data and may start decoding */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
325 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
326 dst = pic->data[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
327 for(i = 0; i < s->height; i += s->rps){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
328 if(s->stripsizes)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
329 ssize = tget(&s->stripsizes, type, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
330 else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
331 ssize = s->stripsize;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
332
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
333 if(s->stripdata){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
334 soff = tget(&s->stripdata, s->sot, s->le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
335 }else
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
336 soff = s->stripoff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
337 src = start + soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
338 if(tiff_unpack_strip(s, dst, stride, src, ssize, FFMIN(s->rps, s->height - i)) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
339 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
340 dst += s->rps * stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
341 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
342 break;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
343 case TIFF_PREDICTOR:
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
344 if(!pic->data[0]){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
345 av_log(s->avctx, AV_LOG_ERROR, "Picture initialization missing\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
346 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
347 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
348 if(value == 2){
4079
00a0b18cfb92 10l predictor should not skip first line
kostya
parents: 4013
diff changeset
349 src = pic->data[0];
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
350 stride = pic->linesize[0];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
351 soff = s->bpp >> 3;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
352 ssize = s->width * soff;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
353 for(i = 0; i < s->height; i++) {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
354 for(j = soff; j < ssize; j++)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
355 src[j] += src[j - soff];
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
356 src += stride;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
357 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
358 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
359 break;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
360 case TIFF_INVERT:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
361 switch(value){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
362 case 0:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
363 s->invert = 1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
364 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
365 case 1:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
366 s->invert = 0;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
367 break;
4187
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
368 case 2:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
369 case 3:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
370 break;
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
371 default:
46f12596304f Print error message for unsupported mode (RGB planar,CMYK,YCrCb)
kostya
parents: 4186
diff changeset
372 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
373 return -1;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
374 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
375 break;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
376 case TIFF_PAL:
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
377 if(s->avctx->pix_fmt != PIX_FMT_PAL8){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
378 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
379 return -1;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
380 }
5261
d6957da94689 use correct type for palette
mru
parents: 5257
diff changeset
381 pal = (uint32_t *) s->picture.data[1];
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
382 off = type_sizes[type];
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
383 rp = buf;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
384 gp = buf + count / 3 * off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
385 bp = buf + count / 3 * off * 2;
4190
405f8395eedc Use table for determining type sizes
kostya
parents: 4188
diff changeset
386 off = (type_sizes[type] - 1) << 3;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
387 for(i = 0; i < count / 3; i++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
388 j = (tget(&rp, type, s->le) >> off) << 16;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
389 j |= (tget(&gp, type, s->le) >> off) << 8;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
390 j |= tget(&bp, type, s->le) >> off;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
391 pal[i] = j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
392 }
4192
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
393 break;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
394 case TIFF_PLANAR:
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
395 if(value == 2){
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
396 av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
397 return -1;
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
398 }
42e870000702 Give error about planar RGB
kostya
parents: 4191
diff changeset
399 break;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
400 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
401 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
402 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
403
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
404 static int decode_frame(AVCodecContext *avctx,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
405 void *data, int *data_size,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
406 uint8_t *buf, int buf_size)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
407 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
408 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
409 AVFrame *picture = data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
410 AVFrame * const p= (AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
411 uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
412 int id, le, off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
413 int i, entries;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
414
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
415 //parse image header
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4193
diff changeset
416 id = AV_RL16(buf); buf += 2;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
417 if(id == 0x4949) le = 1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
418 else if(id == 0x4D4D) le = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
419 else{
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
420 av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
421 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
422 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
423 s->le = le;
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
424 s->invert = 0;
5962
a6c9aa23d379 TIFF may omit compression tag.
kostya
parents: 5261
diff changeset
425 s->compr = TIFF_RAW;
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
426 // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
427 // that further identifies the file as a TIFF file"
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
428 if(tget_short(&buf, le) != 42){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
429 av_log(avctx, AV_LOG_ERROR, "The answer to life, universe and everything is not correct!\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
430 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
431 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
432 /* parse image file directory */
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
433 off = tget_long(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
434 if(orig_buf + off + 14 >= end_buf){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
435 av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
436 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
437 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
438 buf = orig_buf + off;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
439 entries = tget_short(&buf, le);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
440 for(i = 0; i < entries; i++){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
441 if(tiff_decode_tag(s, orig_buf, buf, end_buf, p) < 0)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
442 return -1;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
443 buf += 12;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
444 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
445
4186
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
446 if(s->invert){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
447 uint8_t *src;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
448 int j;
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
449
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
450 src = s->picture.data[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
451 for(j = 0; j < s->height; j++){
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
452 for(i = 0; i < s->picture.linesize[0]; i++)
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
453 src[i] = 255 - src[i];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
454 src += s->picture.linesize[0];
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
455 }
14fe1e8d337c 8-bit images support for TIFF
kostya
parents: 4185
diff changeset
456 }
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
457 *picture= *(AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
458 *data_size = sizeof(AVPicture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
459
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
460 return buf_size;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
461 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
462
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
463 static int tiff_init(AVCodecContext *avctx){
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
464 TiffContext *s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
465
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
466 s->width = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
467 s->height = 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
468 s->avctx = avctx;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
469 avcodec_get_frame_defaults((AVFrame*)&s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
470 avctx->coded_frame= (AVFrame*)&s->picture;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
471 s->picture.data[0] = NULL;
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
472 ff_lzw_decode_open(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
473
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
474 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
475 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
476
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
477 static int tiff_end(AVCodecContext *avctx)
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
478 {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
479 TiffContext * const s = avctx->priv_data;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
480
4080
f426c81afc9e LZW decoder as separate module plus TIFF LZW support
kostya
parents: 4079
diff changeset
481 ff_lzw_decode_close(&s->lzw);
4013
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
482 if(s->picture.data[0])
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
483 avctx->release_buffer(avctx, &s->picture);
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
484 return 0;
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
485 }
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
486
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
487 AVCodec tiff_decoder = {
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
488 "tiff",
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
489 CODEC_TYPE_VIDEO,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
490 CODEC_ID_TIFF,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
491 sizeof(TiffContext),
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
492 tiff_init,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
493 NULL,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
494 tiff_end,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
495 decode_frame,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
496 0,
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
497 NULL
aace6b74fddc TIFF decoder
kostya
parents:
diff changeset
498 };