[FFmpeg-cvslog] tiff: set palette in the context when specified in TIFF_PAL tag
Stefano Sabatini
git at videolan.org
Wed May 25 06:37:12 CEST 2011
ffmpeg | branch: master | Stefano Sabatini <stefano.sabatini-lala at poste.it> | Tue May 24 01:17:25 2011 +0200| [7ca5338b49aa9967c9b18503490ca656e3bd6c5d] | committer: Diego Biurrun
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 at biurrun.de>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7ca5338b49aa9967c9b18503490ca656e3bd6c5d
---
libavcodec/tiff.c | 23 +++++++++++++----------
1 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index ffa5c68..bea3532 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){
More information about the ffmpeg-cvslog
mailing list