aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2011-12-08 02:48:31 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2011-12-08 02:48:31 +0100
commit0cc9949eadc8378000f7c165e3809411651357dc (patch)
tree086317d05ca2f16512f3b8a93dd55acd4edc93bc
parent51d7cd3596fa5341358d107e5a6d6e1945e98520 (diff)
downloadffmpeg-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.c16
-rw-r--r--libavcodec/version.h2
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, \