diff options
author | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2011-05-24 03:17:25 +0400 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2011-05-24 21:33:40 +0400 |
commit | 7ca5338b49aa9967c9b18503490ca656e3bd6c5d (patch) | |
tree | 65fe7cb970d98cea9d3177441b2252784a408eb4 /libavcodec/tiff.c | |
parent | 4515f9b58a51eb0af81c1ed1fd99889fcdc5ae91 (diff) |
tiff: set palette in the context when specified in TIFF_PAL tag
Since image initialization was moved after tag parsing, the
palette needs to be specified in the context and then copied
to the allocated image in init_image().
Fixes a regression with TIFF images that have palette data,
trac issue #230, file Test_Flate_8bpp.tif.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diffstat (limited to 'libavcodec/tiff.c')
-rw-r--r-- | libavcodec/tiff.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index ffa5c6837a..bea353275f 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -41,6 +41,8 @@ typedef struct TiffContext { int width, height; unsigned int bpp, bppcount; + uint32_t palette[256]; + int palette_is_set; int le; enum TiffCompr compr; int invert; @@ -257,11 +259,15 @@ static int init_image(TiffContext *s) av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } - if (s->bpp == 8 && s->picture.data[1]){ - /* make default grayscale pal */ - pal = (uint32_t *) s->picture.data[1]; - for (i = 0; i < 256; i++) - pal[i] = i * 0x010101; + if (s->avctx->pix_fmt == PIX_FMT_PAL8) { + if (s->palette_is_set) { + memcpy(s->picture.data[1], s->palette, sizeof(s->palette)); + } else { + /* make default grayscale pal */ + pal = (uint32_t *) s->picture.data[1]; + for (i = 0; i < 256; i++) + pal[i] = i * 0x010101; + } } return 0; } @@ -444,11 +450,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t * s->fill_order = value - 1; break; case TIFF_PAL: - if(s->avctx->pix_fmt != PIX_FMT_PAL8){ - av_log(s->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n"); - return -1; - } - pal = (uint32_t *) s->picture.data[1]; + pal = (uint32_t *) s->palette; off = type_sizes[type]; rp = buf; gp = buf + count / 3 * off; @@ -460,6 +462,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t * j |= tget(&bp, type, s->le) >> off; pal[i] = j; } + s->palette_is_set = 1; break; case TIFF_PLANAR: if(value == 2){ |