diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-01-14 00:27:43 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-01-14 00:27:43 +0000 |
commit | 6d32ec6ce979f76906d983fa238c41e0bc6480f0 (patch) | |
tree | 363af421232584067f8e1ffcc050a4ca68ede420 /libavformat/gif.c | |
parent | b63f641e9b2aeb0656288f8b16cea272ac890c22 (diff) | |
download | ffmpeg-6d32ec6ce979f76906d983fa238c41e0bc6480f0.tar.gz |
cleanup gif, use BISTREAM_WRITER_LE
Originally committed as revision 16591 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/gif.c')
-rw-r--r-- | libavformat/gif.c | 79 |
1 files changed, 9 insertions, 70 deletions
diff --git a/libavformat/gif.c b/libavformat/gif.c index 0c6686fead..827570c7db 100644 --- a/libavformat/gif.c +++ b/libavformat/gif.c @@ -40,6 +40,11 @@ */ #include "avformat.h" + +/* The GIF format uses reversed order for bitstreams... */ +/* at least they don't use PDP_ENDIAN :) */ +#define BITSTREAM_WRITER_LE + #include "libavcodec/bitstream.h" /* bitstream minipacket size */ @@ -101,72 +106,6 @@ static const rgb_triplet gif_clut[216] = { { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0x33 }, { 0xff, 0xff, 0x66 }, { 0xff, 0xff, 0x99 }, { 0xff, 0xff, 0xcc }, { 0xff, 0xff, 0xff }, }; -/* The GIF format uses reversed order for bitstreams... */ -/* at least they don't use PDP_ENDIAN :) */ -/* so we 'extend' PutBitContext. hmmm, OOP :) */ -/* seems this thing changed slightly since I wrote it... */ - -#ifdef ALT_BITSTREAM_WRITER -# error no ALT_BITSTREAM_WRITER support for now -#endif - -static void gif_put_bits_rev(PutBitContext *s, int n, unsigned int value) -{ - unsigned int bit_buf; - int bit_cnt; - - // printf("put_bits=%d %x\n", n, value); - assert(n == 32 || value < (1U << n)); - - bit_buf = s->bit_buf; - bit_cnt = 32 - s->bit_left; /* XXX:lazyness... was = s->bit_cnt; */ - - // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); - /* XXX: optimize */ - if (n < (32-bit_cnt)) { - bit_buf |= value << (bit_cnt); - bit_cnt+=n; - } else { - bit_buf |= value << (bit_cnt); - - *s->buf_ptr = bit_buf & 0xff; - s->buf_ptr[1] = (bit_buf >> 8) & 0xff; - s->buf_ptr[2] = (bit_buf >> 16) & 0xff; - s->buf_ptr[3] = (bit_buf >> 24) & 0xff; - - //printf("bitbuf = %08x\n", bit_buf); - s->buf_ptr+=4; - if (s->buf_ptr >= s->buf_end) - abort(); -// flush_buffer_rev(s); - bit_cnt=bit_cnt + n - 32; - if (bit_cnt == 0) { - bit_buf = 0; - } else { - bit_buf = value >> (n - bit_cnt); - } - } - - s->bit_buf = bit_buf; - s->bit_left = 32 - bit_cnt; -} - -/* pad the end of the output stream with zeros */ -static void gif_flush_put_bits_rev(PutBitContext *s) -{ - while (s->bit_left < 32) { - /* XXX: should test end of buffer */ - *s->buf_ptr++=s->bit_buf & 0xff; - s->bit_buf>>=8; - s->bit_left+=8; - } -// flush_buffer_rev(s); - s->bit_left=32; - s->bit_buf=0; -} - -/* !RevPutBitContext */ - /* GIF header */ static int gif_image_write_header(ByteIOContext *pb, int width, int height, int loop_count, @@ -272,7 +211,7 @@ static int gif_image_write_image(ByteIOContext *pb, w = width; while(left>0) { - gif_put_bits_rev(&p, 9, 0x0100); /* clear code */ + put_bits(&p, 9, 0x0100); /* clear code */ for(i=(left<GIF_CHUNKS)?left:GIF_CHUNKS;i;i--) { if (pix_fmt == PIX_FMT_RGB24) { @@ -281,7 +220,7 @@ static int gif_image_write_image(ByteIOContext *pb, } else { v = *ptr++; } - gif_put_bits_rev(&p, 9, v); + put_bits(&p, 9, v); if (--w == 0) { w = width; buf += linesize; @@ -290,8 +229,8 @@ static int gif_image_write_image(ByteIOContext *pb, } if(left<=GIF_CHUNKS) { - gif_put_bits_rev(&p, 9, 0x101); /* end of stream */ - gif_flush_put_bits_rev(&p); + put_bits(&p, 9, 0x101); /* end of stream */ + flush_put_bits(&p); } if(pbBufPtr(&p) - p.buf > 0) { put_byte(pb, pbBufPtr(&p) - p.buf); /* byte count of the packet */ |