tiff: refactor deflate support in a separate function

Report when zlib support is missing.
This commit is contained in:
Luca Barbato 2013-06-03 03:51:05 +02:00
parent f8a4d5e970
commit 103937681d
1 changed files with 37 additions and 25 deletions

View File

@ -111,6 +111,35 @@ static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
*len = zstream.total_out; *len = zstream.total_out;
return zret == Z_STREAM_END ? Z_OK : zret; return zret == Z_STREAM_END ? Z_OK : zret;
} }
static int tiff_unpack_zlib(TiffContext *s, uint8_t *dst, int stride,
const uint8_t *src, int size,
int width, int lines)
{
uint8_t *zbuf;
unsigned long outlen;
int ret, line;
outlen = width * lines;
zbuf = av_malloc(outlen);
if (!zbuf)
return AVERROR(ENOMEM);
ret = tiff_uncompress(zbuf, &outlen, src, size);
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);
return AVERROR_UNKNOWN;
}
src = zbuf;
for (line = 0; line < lines; line++) {
memcpy(dst, src, width);
dst += stride;
src += width;
}
av_free(zbuf);
return 0;
}
#endif #endif
static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride, static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
@ -123,33 +152,16 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if (size <= 0) if (size <= 0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
#if CONFIG_ZLIB
if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) { if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
uint8_t *zbuf; #if CONFIG_ZLIB
unsigned long outlen; return tiff_unpack_zlib(s, dst, stride, src, size, width, lines);
int ret; #else
outlen = width * lines; av_log(s->avctx, AV_LOG_ERROR,
zbuf = av_malloc(outlen); "zlib support not enabled, "
if (!zbuf) "deflate compression not supported\n");
return AVERROR(ENOMEM); return AVERROR(ENOSYS);
ret = tiff_uncompress(zbuf, &outlen, src, size);
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);
return AVERROR_UNKNOWN;
}
src = zbuf;
for (line = 0; line < lines; line++) {
memcpy(dst, src, width);
dst += stride;
src += width;
}
av_free(zbuf);
return 0;
}
#endif #endif
}
if (s->compr == TIFF_LZW) { if (s->compr == TIFF_LZW) {
if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) { if ((ret = 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"); av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");