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);
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;
}
AVCodec ff_gif_encoder = {
- "gif",
- AVMEDIA_TYPE_VIDEO,
- CODEC_ID_GIF,
- sizeof(GIFContext),
- gif_encode_init,
- gif_encode_frame,
- gif_encode_close,
+ .name = "gif",
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = CODEC_ID_GIF,
+ .priv_data_size = sizeof(GIFContext),
+ .init = gif_encode_init,
+ .encode = gif_encode_frame,
+ .close = gif_encode_close,
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_RGB8, PIX_FMT_BGR8, PIX_FMT_RGB4_BYTE, PIX_FMT_BGR4_BYTE, PIX_FMT_GRAY8, PIX_FMT_PAL8, PIX_FMT_NONE},
.long_name= NULL_IF_CONFIG_SMALL("GIF (Graphics Interchange Format)"),
};