diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-02-14 01:25:41 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-02-14 01:25:41 +0000 |
commit | b6335c9f5ba92a87dad33f2ccd292ff37b397afa (patch) | |
tree | 2ff2a7ce7b1fb9607341aaaf199820322a507544 /libavcodec | |
parent | 842b556af2c984e8b51278b75f5203e154031049 (diff) | |
download | ffmpeg-b6335c9f5ba92a87dad33f2ccd292ff37b397afa.tar.gz |
ff_copy_bits() optimization
Originally committed as revision 2777 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/mpegvideo.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 6c483dcc81..519fa5c735 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -3732,21 +3732,26 @@ void ff_mpeg_flush(AVCodecContext *avctx){ #ifdef CONFIG_ENCODERS void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length) { + const uint16_t *srcw= src; int words= length>>4; int bits= length&15; int i; if(length==0) return; - if(put_bits_count(pb)&7){ - for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i])); + if(words < 16){ + for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i])); + }else if(put_bits_count(pb)&7){ + for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i])); }else{ + for(i=0; put_bits_count(pb)&31; i++) + put_bits(pb, 8, src[i]); flush_put_bits(pb); - memcpy(pbBufPtr(pb), src, 2*words); - skip_put_bytes(pb, 2*words); + memcpy(pbBufPtr(pb), src+i, 2*words-i); + skip_put_bytes(pb, 2*words-i); } - put_bits(pb, bits, be2me_16(((uint16_t*)src)[words])>>(16-bits)); + put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits)); } static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){ |