Mercurial > libavcodec.hg
changeset 8591:d1e300c41ed5 libavcodec
cleanup gif, use BISTREAM_WRITER_LE
author | bcoudurier |
---|---|
date | Wed, 14 Jan 2009 00:27:43 +0000 |
parents | 7a463923ecd1 |
children | 9aac5b3cecbd |
files | gif.c |
diffstat | 1 files changed, 9 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/gif.c Tue Jan 13 23:44:16 2009 +0000 +++ b/gif.c Wed Jan 14 00:27:43 2009 +0000 @@ -43,6 +43,11 @@ #include "avcodec.h" #include "bytestream.h" + +/* The GIF format uses reversed order for bitstreams... */ +/* at least they don't use PDP_ENDIAN :) */ +#define BITSTREAM_WRITER_LE + #include "bitstream.h" /* bitstream minipacket size */ @@ -104,68 +109,6 @@ { 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); - - bytestream_put_le32(&s->buf_ptr, bit_buf); - - //printf("bitbuf = %08x\n", bit_buf); - 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(uint8_t **bytestream, int width, int height, int loop_count, @@ -269,7 +212,7 @@ 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) { @@ -278,7 +221,7 @@ } else { v = *ptr++; } - gif_put_bits_rev(&p, 9, v); + put_bits(&p, 9, v); if (--w == 0) { w = width; buf += linesize; @@ -287,8 +230,8 @@ } 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) { bytestream_put_byte(bytestream, pbBufPtr(&p) - p.buf); /* byte count of the packet */