101
106
{ 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0x33 }, { 0xff, 0xff, 0x66 }, { 0xff, 0xff, 0x99 }, { 0xff, 0xff, 0xcc }, { 0xff, 0xff, 0xff },
104
/* The GIF format uses reversed order for bitstreams... */
105
/* at least they don't use PDP_ENDIAN :) */
106
/* so we 'extend' PutBitContext. hmmm, OOP :) */
107
/* seems this thing changed slightly since I wrote it... */
109
#ifdef ALT_BITSTREAM_WRITER
110
# error no ALT_BITSTREAM_WRITER support for now
113
static void gif_put_bits_rev(PutBitContext *s, int n, unsigned int value)
115
unsigned int bit_buf;
118
// printf("put_bits=%d %x\n", n, value);
119
assert(n == 32 || value < (1U << n));
121
bit_buf = s->bit_buf;
122
bit_cnt = 32 - s->bit_left; /* XXX:lazyness... was = s->bit_cnt; */
124
// printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
126
if (n < (32-bit_cnt)) {
127
bit_buf |= value << (bit_cnt);
130
bit_buf |= value << (bit_cnt);
132
*s->buf_ptr = bit_buf & 0xff;
133
s->buf_ptr[1] = (bit_buf >> 8) & 0xff;
134
s->buf_ptr[2] = (bit_buf >> 16) & 0xff;
135
s->buf_ptr[3] = (bit_buf >> 24) & 0xff;
137
//printf("bitbuf = %08x\n", bit_buf);
139
if (s->buf_ptr >= s->buf_end)
140
puts("bit buffer overflow !!"); // should never happen ! who got rid of the callback ???
141
// flush_buffer_rev(s);
142
bit_cnt=bit_cnt + n - 32;
146
bit_buf = value >> (n - bit_cnt);
150
s->bit_buf = bit_buf;
151
s->bit_left = 32 - bit_cnt;
154
/* pad the end of the output stream with zeros */
155
static void gif_flush_put_bits_rev(PutBitContext *s)
157
while (s->bit_left < 32) {
158
/* XXX: should test end of buffer */
159
*s->buf_ptr++=s->bit_buf & 0xff;
163
// flush_buffer_rev(s);
168
/* !RevPutBitContext */
171
110
static int gif_image_write_header(ByteIOContext *pb,
172
111
int width, int height, int loop_count,
275
gif_put_bits_rev(&p, 9, 0x0100); /* clear code */
214
put_bits(&p, 9, 0x0100); /* clear code */
277
216
for(i=(left<GIF_CHUNKS)?left:GIF_CHUNKS;i;i--) {
278
217
if (pix_fmt == PIX_FMT_RGB24) {
292
231
if(left<=GIF_CHUNKS) {
293
gif_put_bits_rev(&p, 9, 0x101); /* end of stream */
294
gif_flush_put_bits_rev(&p);
232
put_bits(&p, 9, 0x101); /* end of stream */
296
235
if(pbBufPtr(&p) - p.buf > 0) {
297
236
put_byte(pb, pbBufPtr(&p) - p.buf); /* byte count of the packet */
313
252
static int gif_write_header(AVFormatContext *s)
315
254
GIFContext *gif = s->priv_data;
316
ByteIOContext *pb = &s->pb;
255
ByteIOContext *pb = s->pb;
317
256
AVCodecContext *enc, *video_enc;
318
257
int i, width, height, loop_count /*, rate*/;
349
288
gif_image_write_header(pb, width, height, loop_count, NULL);
351
put_flush_packet(&s->pb);
290
put_flush_packet(s->pb);
355
294
static int gif_write_video(AVFormatContext *s,
356
295
AVCodecContext *enc, const uint8_t *buf, int size)
358
ByteIOContext *pb = &s->pb;
297
ByteIOContext *pb = s->pb;
359
298
GIFContext *gif = s->priv_data;
383
322
gif_image_write_image(pb, 0, 0, enc->width, enc->height,
384
323
buf, enc->width * 3, PIX_FMT_RGB24);
386
put_flush_packet(&s->pb);
325
put_flush_packet(s->pb);
399
338
static int gif_write_trailer(AVFormatContext *s)
401
ByteIOContext *pb = &s->pb;
340
ByteIOContext *pb = s->pb;
403
342
put_byte(pb, 0x3b);
404
put_flush_packet(&s->pb);
343
put_flush_packet(s->pb);
408
347
AVOutputFormat gif_muxer = {
349
NULL_IF_CONFIG_SMALL("GIF Animation"),
413
352
sizeof(GIFContext),