X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fgif.c;h=4741915bac63666bd2b567a46f1c2b5133759d4a;hb=2a5db1aa588eb157c35e44ca2a76a1184aa5bcf4;hp=b952fbe69702a2d71ba2570b54433266dec3d9d9;hpb=ccd425e7993ef0e76da7bf10c566d33f7acc7c6d;p=ffmpeg diff --git a/libavformat/gif.c b/libavformat/gif.c index b952fbe6970..4741915bac6 100644 --- a/libavformat/gif.c +++ b/libavformat/gif.c @@ -1,6 +1,6 @@ /* * Animated GIF muxer - * Copyright (c) 2000 Fabrice Bellard. + * Copyright (c) 2000 Fabrice Bellard * * This file is part of FFmpeg. * @@ -40,7 +40,12 @@ */ #include "avformat.h" -#include "bitstream.h" + +/* The GIF format uses reversed order for bitstreams... */ +/* at least they don't use PDP_ENDIAN :) */ +#define BITSTREAM_WRITER_LE + +#include "libavcodec/put_bits.h" /* bitstream minipacket size */ #define GIF_CHUNKS 100 @@ -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 0) { - put_byte(pb, pbBufPtr(&p) - p.buf); /* byte count of the packet */ - put_buffer(pb, p.buf, pbBufPtr(&p) - p.buf); /* the actual buffer */ + 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 */ p.buf_ptr = p.buf; /* dequeue the bytes off the bitstream */ } left-=GIF_CHUNKS; @@ -327,7 +266,7 @@ static int gif_write_header(AVFormatContext *s) video_enc = NULL; for(i=0;inb_streams;i++) { enc = s->streams[i]->codec; - if (enc->codec_type != CODEC_TYPE_AUDIO) + if (enc->codec_type != AVMEDIA_TYPE_AUDIO) video_enc = enc; } @@ -390,7 +329,7 @@ static int gif_write_video(AVFormatContext *s, static int gif_write_packet(AVFormatContext *s, AVPacket *pkt) { AVCodecContext *codec = s->streams[pkt->stream_index]->codec; - if (codec->codec_type == CODEC_TYPE_AUDIO) + if (codec->codec_type == AVMEDIA_TYPE_AUDIO) return 0; /* just ignore audio */ else return gif_write_video(s, codec, pkt->data, pkt->size); @@ -407,7 +346,7 @@ static int gif_write_trailer(AVFormatContext *s) AVOutputFormat gif_muxer = { "gif", - "GIF Animation", + NULL_IF_CONFIG_SMALL("GIF Animation"), "image/gif", "gif", sizeof(GIFContext),