1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-09-07 00:20:09 +02:00

Merge commit '103937681d7e6afd3e8caf8937272575e450fb55'

* commit '103937681d7e6afd3e8caf8937272575e450fb55':
  tiff: refactor deflate support in a separate function

Conflicts:
	libavcodec/tiff.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-06-08 11:18:37 +02:00
commit a804632b15

View File

@ -354,29 +354,6 @@ static int add_metadata(int count, int type,
};
}
#if CONFIG_ZLIB
static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
int size)
{
z_stream zstream = { 0 };
int zret;
zstream.next_in = (uint8_t *)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;
}
#endif
static void av_always_inline horizontal_fill(unsigned int bpp, uint8_t* dst,
int usePtr, const uint8_t *src,
uint8_t c, int width, int offset)
@ -430,6 +407,69 @@ static int deinvert_buffer(TiffContext *s, const uint8_t *src, int size)
return 0;
}
#if CONFIG_ZLIB
static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
int size)
{
z_stream zstream = { 0 };
int zret;
zstream.next_in = (uint8_t *)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_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);
if (s->fill_order) {
if ((ret = deinvert_buffer(s, src, size)) < 0) {
av_free(zbuf);
return ret;
}
src = s->deinvert_buf;
}
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++) {
if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
} else {
memcpy(dst, src, width);
}
dst += stride;
src += width;
}
av_free(zbuf);
return 0;
}
#endif
static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
const uint8_t *src, int size, int lines)
{
@ -443,44 +483,16 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if (size <= 0)
return AVERROR_INVALIDDATA;
#if CONFIG_ZLIB
if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
uint8_t *zbuf;
unsigned long outlen;
int ret;
outlen = width * lines;
zbuf = av_malloc(outlen);
if (!zbuf)
return AVERROR(ENOMEM);
if (s->fill_order) {
if ((ret = deinvert_buffer(s, src, size)) < 0) {
av_free(zbuf);
return ret;
}
ssrc = src = s->deinvert_buf;
}
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++) {
if(s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
}else{
memcpy(dst, src, width);
}
dst += stride;
src += width;
}
av_free(zbuf);
return 0;
}
#if CONFIG_ZLIB
return tiff_unpack_zlib(s, dst, stride, src, size, width, lines);
#else
av_log(s->avctx, AV_LOG_ERROR,
"zlib support not enabled, "
"deflate compression not supported\n");
return AVERROR(ENOSYS);
#endif
}
if (s->compr == TIFF_LZW) {
if (s->fill_order) {
if ((ret = deinvert_buffer(s, src, size)) < 0)