summaryrefslogtreecommitdiff
path: root/libavcodec/tiff.c
diff options
context:
space:
mode:
authorPiotr Bandurski <ami_stuff@o2.pl>2012-12-20 15:36:44 +0000
committerPaul B Mahol <onemda@gmail.com>2012-12-20 15:38:52 +0000
commit17714adbf807e946c6e0a1a9e3f605564426102a (patch)
tree00335efac434cebf9ace7bb7153657c36ba939ff /libavcodec/tiff.c
parent217bdd08e347cd170efa488e9ab0f4895d2b103a (diff)
tiffdec: support LZW compression with inverted FillOrder
Diffstat (limited to 'libavcodec/tiff.c')
-rw-r--r--libavcodec/tiff.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 286cbc26a1..e92967d01e 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -62,6 +62,9 @@ typedef struct TiffContext {
int stripsizesoff, stripsize, stripoff, strippos;
LZWState *lzw;
+ uint8_t *deinvert_buf;
+ int deinvert_buf_size;
+
int geotag_count;
TiffGeoTag *geotags;
} TiffContext;
@@ -449,6 +452,16 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
}
#endif
if (s->compr == TIFF_LZW) {
+ if (s->fill_order) {
+ int i;
+ av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size);
+ if (!s->deinvert_buf)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < size; i++)
+ s->deinvert_buf[i] = ff_reverse[src[i]];
+ src = s->deinvert_buf;
+ ssrc = src;
+ }
if (ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
return -1;
@@ -1192,6 +1205,7 @@ static av_cold int tiff_end(AVCodecContext *avctx)
free_geotags(s);
ff_lzw_decode_close(&s->lzw);
+ av_freep(&s->deinvert_buf);
if (s->picture.data[0])
avctx->release_buffer(avctx, &s->picture);
return 0;