* Animated GIF muxer
* Copyright (c) 2000 Fabrice Bellard
*
- * This file is part of FFmpeg.
+ * This file is part of Libav.
*
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * FFmpeg is distributed in the hope that it will be useful,
+ * Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
};
/* GIF header */
-static int gif_image_write_header(ByteIOContext *pb,
+static int gif_image_write_header(AVIOContext *pb,
int width, int height, int loop_count,
uint32_t *palette)
{
int i;
unsigned int v;
- put_tag(pb, "GIF");
- put_tag(pb, "89a");
- put_le16(pb, width);
- put_le16(pb, height);
+ avio_write(pb, "GIF", 3);
+ avio_write(pb, "89a", 3);
+ avio_wl16(pb, width);
+ avio_wl16(pb, height);
- put_byte(pb, 0xf7); /* flags: global clut, 256 entries */
- put_byte(pb, 0x1f); /* background color index */
- put_byte(pb, 0); /* aspect ratio */
+ avio_w8(pb, 0xf7); /* flags: global clut, 256 entries */
+ avio_w8(pb, 0x1f); /* background color index */
+ avio_w8(pb, 0); /* aspect ratio */
/* the global palette */
if (!palette) {
- put_buffer(pb, (const unsigned char *)gif_clut, 216*3);
+ avio_write(pb, (const unsigned char *)gif_clut, 216*3);
for(i=0;i<((256-216)*3);i++)
- put_byte(pb, 0);
+ avio_w8(pb, 0);
} else {
for(i=0;i<256;i++) {
v = palette[i];
- put_byte(pb, (v >> 16) & 0xff);
- put_byte(pb, (v >> 8) & 0xff);
- put_byte(pb, (v) & 0xff);
+ avio_w8(pb, (v >> 16) & 0xff);
+ avio_w8(pb, (v >> 8) & 0xff);
+ avio_w8(pb, (v) & 0xff);
}
}
/* application extension header */
#ifdef GIF_ADD_APP_HEADER
if (loop_count >= 0 && loop_count <= 65535) {
- put_byte(pb, 0x21);
- put_byte(pb, 0xff);
- put_byte(pb, 0x0b);
- put_tag(pb, "NETSCAPE2.0"); // bytes 4 to 14
- put_byte(pb, 0x03); // byte 15
- put_byte(pb, 0x01); // byte 16
- put_le16(pb, (uint16_t)loop_count);
- put_byte(pb, 0x00); // byte 19
+ avio_w8(pb, 0x21);
+ avio_w8(pb, 0xff);
+ avio_w8(pb, 0x0b);
+ avio_write(pb, "NETSCAPE2.0", sizeof("NETSCAPE2.0") - 1); // bytes 4 to 14
+ avio_w8(pb, 0x03); // byte 15
+ avio_w8(pb, 0x01); // byte 16
+ avio_wl16(pb, (uint16_t)loop_count);
+ avio_w8(pb, 0x00); // byte 19
}
#endif
return 0;
}
-static int gif_image_write_image(ByteIOContext *pb,
+static int gif_image_write_image(AVIOContext *pb,
int x1, int y1, int width, int height,
const uint8_t *buf, int linesize, int pix_fmt)
{
const uint8_t *ptr;
/* image block */
- put_byte(pb, 0x2c);
- put_le16(pb, x1);
- put_le16(pb, y1);
- put_le16(pb, width);
- put_le16(pb, height);
- put_byte(pb, 0x00); /* flags */
+ avio_w8(pb, 0x2c);
+ avio_wl16(pb, x1);
+ avio_wl16(pb, y1);
+ avio_wl16(pb, width);
+ avio_wl16(pb, height);
+ avio_w8(pb, 0x00); /* flags */
/* no local clut */
- put_byte(pb, 0x08);
+ avio_w8(pb, 0x08);
left= width * height;
flush_put_bits(&p);
}
if(put_bits_ptr(&p) - p.buf > 0) {
- put_byte(pb, put_bits_ptr(&p) - p.buf); /* byte count of the packet */
- put_buffer(pb, p.buf, put_bits_ptr(&p) - p.buf); /* the actual buffer */
+ avio_w8(pb, put_bits_ptr(&p) - p.buf); /* byte count of the packet */
+ avio_write(pb, p.buf, put_bits_ptr(&p) - p.buf); /* the actual buffer */
p.buf_ptr = p.buf; /* dequeue the bytes off the bitstream */
}
left-=GIF_CHUNKS;
}
- put_byte(pb, 0x00); /* end of image block */
+ avio_w8(pb, 0x00); /* end of image block */
return 0;
}
static int gif_write_header(AVFormatContext *s)
{
GIFContext *gif = s->priv_data;
- ByteIOContext *pb = s->pb;
+ AVIOContext *pb = s->pb;
AVCodecContext *enc, *video_enc;
int i, width, height, loop_count /*, rate*/;
gif_image_write_header(pb, width, height, loop_count, NULL);
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
return 0;
}
static int gif_write_video(AVFormatContext *s,
AVCodecContext *enc, const uint8_t *buf, int size)
{
- ByteIOContext *pb = s->pb;
+ AVIOContext *pb = s->pb;
GIFContext *gif = s->priv_data;
int jiffies;
int64_t delay;
/* graphic control extension block */
- put_byte(pb, 0x21);
- put_byte(pb, 0xf9);
- put_byte(pb, 0x04); /* block size */
- put_byte(pb, 0x04); /* flags */
+ avio_w8(pb, 0x21);
+ avio_w8(pb, 0xf9);
+ avio_w8(pb, 0x04); /* block size */
+ avio_w8(pb, 0x04); /* flags */
/* 1 jiffy is 1/70 s */
/* the delay_time field indicates the number of jiffies - 1 */
/* XXX: don't even remember if I really use it for now */
jiffies = (70*enc->time_base.num/enc->time_base.den) - 1;
- put_le16(pb, jiffies);
+ avio_wl16(pb, jiffies);
- put_byte(pb, 0x1f); /* transparent color index */
- put_byte(pb, 0x00);
+ avio_w8(pb, 0x1f); /* transparent color index */
+ avio_w8(pb, 0x00);
gif_image_write_image(pb, 0, 0, enc->width, enc->height,
buf, enc->width * 3, PIX_FMT_RGB24);
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
return 0;
}
static int gif_write_trailer(AVFormatContext *s)
{
- ByteIOContext *pb = s->pb;
+ AVIOContext *pb = s->pb;
- put_byte(pb, 0x3b);
- put_flush_packet(s->pb);
+ avio_w8(pb, 0x3b);
+ avio_flush(s->pb);
return 0;
}