diff options
author | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2011-12-08 02:48:31 +0100 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2011-12-08 02:48:31 +0100 |
commit | 0cc9949eadc8378000f7c165e3809411651357dc (patch) | |
tree | 086317d05ca2f16512f3b8a93dd55acd4edc93bc /libavcodec/gif.c | |
parent | 51d7cd3596fa5341358d107e5a6d6e1945e98520 (diff) | |
download | ffmpeg-0cc9949eadc8378000f7c165e3809411651357dc.tar.gz |
Mark one colour as transparent in the gif image encoder
if the input palette contains at least one colour
that is more than 50% transparent.
Fixes ticket #715.
Diffstat (limited to 'libavcodec/gif.c')
-rw-r--r-- | libavcodec/gif.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/libavcodec/gif.c b/libavcodec/gif.c index 8736f0f46c..830a059422 100644 --- a/libavcodec/gif.c +++ b/libavcodec/gif.c @@ -62,7 +62,7 @@ static int gif_image_write_header(AVCodecContext *avctx, uint8_t **bytestream, uint32_t *palette) { int i; - unsigned int v; + unsigned int v, smallest_alpha = 0xFF, alpha_component = 0; bytestream_put_buffer(bytestream, "GIF", 3); bytestream_put_buffer(bytestream, "89a", 3); @@ -77,6 +77,20 @@ static int gif_image_write_header(AVCodecContext *avctx, for(i=0;i<256;i++) { v = palette[i]; bytestream_put_be24(bytestream, v); + if (v >> 24 < smallest_alpha) { + smallest_alpha = v >> 24; + alpha_component = i; + } + } + + if (smallest_alpha < 128) { + bytestream_put_byte(bytestream, 0x21); /* Extension Introducer */ + bytestream_put_byte(bytestream, 0xf9); /* Graphic Control Label */ + bytestream_put_byte(bytestream, 0x04); /* block length */ + bytestream_put_byte(bytestream, 0x01); /* Transparent Color Flag */ + bytestream_put_le16(bytestream, 0x00); /* no delay */ + bytestream_put_byte(bytestream, alpha_component); + bytestream_put_byte(bytestream, 0x00); } return 0; |