3 * Copyright (c) 2006 Konstantin Shishkov
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author Konstantin Shishkov
35 typedef struct TiffContext
{
36 AVCodecContext
*avctx
;
49 int stripsize
, stripoff
;
53 static int tget_short(uint8_t **p
, int le
){
54 int v
= le
? AV_RL16(*p
) : AV_RB16(*p
);
59 static int tget_long(uint8_t **p
, int le
){
60 int v
= le
? AV_RL32(*p
) : AV_RB32(*p
);
65 static int tget(uint8_t **p
, int type
, int le
){
67 case TIFF_BYTE
: return *(*p
)++;
68 case TIFF_SHORT
: return tget_short(p
, le
);
69 case TIFF_LONG
: return tget_long (p
, le
);
74 static int tiff_unpack_strip(TiffContext
*s
, uint8_t* dst
, int stride
, uint8_t *src
, int size
, int lines
){
75 int c
, line
, pixels
, code
;
77 int width
= s
->width
* (s
->bpp
/ 8);
79 uint8_t *zbuf
; unsigned long outlen
;
81 if(s
->compr
== TIFF_DEFLATE
|| s
->compr
== TIFF_ADOBE_DEFLATE
){
82 outlen
= width
* lines
;
83 zbuf
= av_malloc(outlen
);
84 if(uncompress(zbuf
, &outlen
, src
, size
) != Z_OK
){
85 av_log(s
->avctx
, AV_LOG_ERROR
, "Uncompressing failed (%lu of %lu)\n", outlen
, (unsigned long)width
* lines
);
90 for(line
= 0; line
< lines
; line
++){
91 memcpy(dst
, src
, width
);
99 if(s
->compr
== TIFF_LZW
){
100 if(ff_lzw_decode_init(s
->lzw
, 8, src
, size
, FF_LZW_TIFF
) < 0){
101 av_log(s
->avctx
, AV_LOG_ERROR
, "Error initializing LZW decoder\n");
105 for(line
= 0; line
< lines
; line
++){
106 if(src
- ssrc
> size
){
107 av_log(s
->avctx
, AV_LOG_ERROR
, "Source data overread\n");
112 memcpy(dst
, src
, s
->width
* (s
->bpp
/ 8));
113 src
+= s
->width
* (s
->bpp
/ 8);
116 for(pixels
= 0; pixels
< width
;){
117 code
= (int8_t)*src
++;
120 if(pixels
+ code
> width
){
121 av_log(s
->avctx
, AV_LOG_ERROR
, "Copy went out of bounds\n");
124 memcpy(dst
+ pixels
, src
, code
);
127 }else if(code
!= -128){ // -127..-1
129 if(pixels
+ code
> width
){
130 av_log(s
->avctx
, AV_LOG_ERROR
, "Run went out of bounds\n");
134 memset(dst
+ pixels
, c
, code
);
140 pixels
= ff_lzw_decode(s
->lzw
, dst
, width
);
142 av_log(s
->avctx
, AV_LOG_ERROR
, "Decoded only %i bytes of %i\n", pixels
, width
);
153 static int tiff_decode_tag(TiffContext
*s
, uint8_t *start
, uint8_t *buf
, uint8_t *end_buf
, AVFrame
*pic
)
155 int tag
, type
, count
, off
, value
= 0;
157 int i
, j
, ssize
, soff
, stride
;
159 uint8_t *rp
, *gp
, *bp
;
161 tag
= tget_short(&buf
, s
->le
);
162 type
= tget_short(&buf
, s
->le
);
163 count
= tget_long(&buf
, s
->le
);
164 off
= tget_long(&buf
, s
->le
);
171 value
= tget(&buf
, type
, s
->le
);
182 }else if(type_sizes
[type
] * count
<= 4){
188 if(buf
&& (buf
< start
|| buf
> end_buf
)){
189 av_log(s
->avctx
, AV_LOG_ERROR
, "Tag referencing position outside the image\n");
201 if(count
== 1) s
->bpp
= value
;
205 s
->bpp
= (off
& 0xFF) + ((off
>> 8) & 0xFF) + ((off
>> 16) & 0xFF) + ((off
>> 24) & 0xFF);
210 for(i
= 0; i
< count
; i
++) s
->bpp
+= tget(&buf
, type
, s
->le
);
218 s
->avctx
->pix_fmt
= PIX_FMT_PAL8
;
221 s
->avctx
->pix_fmt
= PIX_FMT_RGB24
;
225 s
->avctx
->pix_fmt
= PIX_FMT_GRAY16BE
;
227 av_log(s
->avctx
, AV_LOG_ERROR
, "This format is not supported (bpp=%i)\n", s
->bpp
);
232 av_log(s
->avctx
, AV_LOG_ERROR
, "This format is not supported (bpp=%i)\n", s
->bpp
);
235 if(s
->width
!= s
->avctx
->width
|| s
->height
!= s
->avctx
->height
){
236 if(avcodec_check_dimensions(s
->avctx
, s
->width
, s
->height
))
238 avcodec_set_dimensions(s
->avctx
, s
->width
, s
->height
);
240 if(s
->picture
.data
[0])
241 s
->avctx
->release_buffer(s
->avctx
, &s
->picture
);
242 if(s
->avctx
->get_buffer(s
->avctx
, &s
->picture
) < 0){
243 av_log(s
->avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
247 /* make default grayscale pal */
248 pal
= (uint32_t *) s
->picture
.data
[1];
249 for(i
= 0; i
< 256; i
++)
250 pal
[i
] = i
* 0x010101;
261 case TIFF_ADOBE_DEFLATE
:
265 av_log(s
->avctx
, AV_LOG_ERROR
, "Deflate: ZLib not compiled in\n");
269 av_log(s
->avctx
, AV_LOG_ERROR
, "CCITT G3 compression is not supported\n");
272 av_log(s
->avctx
, AV_LOG_ERROR
, "CCITT G4 compression is not supported\n");
275 av_log(s
->avctx
, AV_LOG_ERROR
, "CCITT RLE compression is not supported\n");
279 av_log(s
->avctx
, AV_LOG_ERROR
, "JPEG compression is not supported\n");
282 av_log(s
->avctx
, AV_LOG_ERROR
, "Unknown compression method %i\n", s
->compr
);
286 case TIFF_ROWSPERSTRIP
:
288 av_log(s
->avctx
, AV_LOG_ERROR
, "Incorrect value of rows per strip\n");
293 case TIFF_STRIP_OFFS
:
298 s
->stripdata
= start
+ off
;
300 if(s
->strips
== 1) s
->rps
= s
->height
;
302 if(s
->stripdata
> end_buf
){
303 av_log(s
->avctx
, AV_LOG_ERROR
, "Tag referencing position outside the image\n");
307 case TIFF_STRIP_SIZE
:
309 s
->stripsizes
= NULL
;
310 s
->stripsize
= value
;
313 s
->stripsizes
= start
+ off
;
316 if(s
->stripsizes
> end_buf
){
317 av_log(s
->avctx
, AV_LOG_ERROR
, "Tag referencing position outside the image\n");
321 av_log(s
->avctx
, AV_LOG_ERROR
, "Picture initialization missing\n");
324 /* now we have the data and may start decoding */
325 stride
= pic
->linesize
[0];
327 for(i
= 0; i
< s
->height
; i
+= s
->rps
){
329 ssize
= tget(&s
->stripsizes
, type
, s
->le
);
331 ssize
= s
->stripsize
;
334 soff
= tget(&s
->stripdata
, s
->sot
, s
->le
);
338 if(tiff_unpack_strip(s
, dst
, stride
, src
, ssize
, FFMIN(s
->rps
, s
->height
- i
)) < 0)
340 dst
+= s
->rps
* stride
;
345 av_log(s
->avctx
, AV_LOG_ERROR
, "Picture initialization missing\n");
350 stride
= pic
->linesize
[0];
352 ssize
= s
->width
* soff
;
353 for(i
= 0; i
< s
->height
; i
++) {
354 for(j
= soff
; j
< ssize
; j
++)
355 src
[j
] += src
[j
- soff
];
372 av_log(s
->avctx
, AV_LOG_ERROR
, "Color mode %d is not supported\n", value
);
377 if(s
->avctx
->pix_fmt
!= PIX_FMT_PAL8
){
378 av_log(s
->avctx
, AV_LOG_ERROR
, "Palette met but this is not palettized format\n");
381 pal
= (uint32_t *) s
->picture
.data
[1];
382 off
= type_sizes
[type
];
384 gp
= buf
+ count
/ 3 * off
;
385 bp
= buf
+ count
/ 3 * off
* 2;
386 off
= (type_sizes
[type
] - 1) << 3;
387 for(i
= 0; i
< count
/ 3; i
++){
388 j
= (tget(&rp
, type
, s
->le
) >> off
) << 16;
389 j
|= (tget(&gp
, type
, s
->le
) >> off
) << 8;
390 j
|= tget(&bp
, type
, s
->le
) >> off
;
396 av_log(s
->avctx
, AV_LOG_ERROR
, "Planar format is not supported\n");
404 static int decode_frame(AVCodecContext
*avctx
,
405 void *data
, int *data_size
,
406 uint8_t *buf
, int buf_size
)
408 TiffContext
* const s
= avctx
->priv_data
;
409 AVFrame
*picture
= data
;
410 AVFrame
* const p
= (AVFrame
*)&s
->picture
;
411 uint8_t *orig_buf
= buf
, *end_buf
= buf
+ buf_size
;
416 id
= AV_RL16(buf
); buf
+= 2;
417 if(id
== 0x4949) le
= 1;
418 else if(id
== 0x4D4D) le
= 0;
420 av_log(avctx
, AV_LOG_ERROR
, "TIFF header not found\n");
425 // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
426 // that further identifies the file as a TIFF file"
427 if(tget_short(&buf
, le
) != 42){
428 av_log(avctx
, AV_LOG_ERROR
, "The answer to life, universe and everything is not correct!\n");
431 /* parse image file directory */
432 off
= tget_long(&buf
, le
);
433 if(orig_buf
+ off
+ 14 >= end_buf
){
434 av_log(avctx
, AV_LOG_ERROR
, "IFD offset is greater than image size\n");
437 buf
= orig_buf
+ off
;
438 entries
= tget_short(&buf
, le
);
439 for(i
= 0; i
< entries
; i
++){
440 if(tiff_decode_tag(s
, orig_buf
, buf
, end_buf
, p
) < 0)
449 src
= s
->picture
.data
[0];
450 for(j
= 0; j
< s
->height
; j
++){
451 for(i
= 0; i
< s
->picture
.linesize
[0]; i
++)
452 src
[i
] = 255 - src
[i
];
453 src
+= s
->picture
.linesize
[0];
456 *picture
= *(AVFrame
*)&s
->picture
;
457 *data_size
= sizeof(AVPicture
);
462 static int tiff_init(AVCodecContext
*avctx
){
463 TiffContext
*s
= avctx
->priv_data
;
468 avcodec_get_frame_defaults((AVFrame
*)&s
->picture
);
469 avctx
->coded_frame
= (AVFrame
*)&s
->picture
;
470 s
->picture
.data
[0] = NULL
;
471 ff_lzw_decode_open(&s
->lzw
);
476 static int tiff_end(AVCodecContext
*avctx
)
478 TiffContext
* const s
= avctx
->priv_data
;
480 ff_lzw_decode_close(&s
->lzw
);
481 if(s
->picture
.data
[0])
482 avctx
->release_buffer(avctx
, &s
->picture
);
486 AVCodec tiff_decoder
= {