Commit f1845fd0 authored by kostya's avatar kostya

Looks like ZLib uncompress() cannot deal with some kinds of TIFF deflated data,

so replace it with custom code.
This fixes issue 1419. 



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20054 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent f7a61981
...@@ -75,6 +75,27 @@ static int tget(const uint8_t **p, int type, int le){ ...@@ -75,6 +75,27 @@ static int tget(const uint8_t **p, int type, int le){
} }
} }
static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src, int size)
{
z_stream zstream;
int zret;
memset(&zstream, 0, sizeof(zstream));
zstream.next_in = src;
zstream.avail_in = size;
zstream.next_out = dst;
zstream.avail_out = *len;
zret = inflateInit(&zstream);
if (zret != Z_OK) {
av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
return zret;
}
zret = inflate(&zstream, Z_SYNC_FLUSH);
inflateEnd(&zstream);
*len = zstream.total_out;
return zret == Z_STREAM_END ? Z_OK : zret;
}
static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uint8_t *src, int size, int lines){ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uint8_t *src, int size, int lines){
int c, line, pixels, code; int c, line, pixels, code;
const uint8_t *ssrc = src; const uint8_t *ssrc = src;
...@@ -83,10 +104,12 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin ...@@ -83,10 +104,12 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin
uint8_t *zbuf; unsigned long outlen; uint8_t *zbuf; unsigned long outlen;
if(s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE){ if(s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE){
int ret;
outlen = width * lines; outlen = width * lines;
zbuf = av_malloc(outlen); zbuf = av_malloc(outlen);
if(uncompress(zbuf, &outlen, src, size) != Z_OK){ ret = tiff_uncompress(zbuf, &outlen, src, size);
av_log(s->avctx, AV_LOG_ERROR, "Uncompressing failed (%lu of %lu)\n", outlen, (unsigned long)width * lines); if(ret != Z_OK){
av_log(s->avctx, AV_LOG_ERROR, "Uncompressing failed (%lu of %lu) with error %d\n", outlen, (unsigned long)width * lines, ret);
av_free(zbuf); av_free(zbuf);
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment