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 | |
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.
-rw-r--r-- | libavcodec/gif.c | 16 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
2 files changed, 16 insertions, 2 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; diff --git a/libavcodec/version.h b/libavcodec/version.h index 3c9c4dc896..9042e26e2f 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -22,7 +22,7 @@ #define LIBAVCODEC_VERSION_MAJOR 53 #define LIBAVCODEC_VERSION_MINOR 41 -#define LIBAVCODEC_VERSION_MICRO 1 +#define LIBAVCODEC_VERSION_MICRO 2 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ |