summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-02-14 01:25:41 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-02-14 01:25:41 +0000
commitb6335c9f5ba92a87dad33f2ccd292ff37b397afa (patch)
tree2ff2a7ce7b1fb9607341aaaf199820322a507544 /libavcodec
parent842b556af2c984e8b51278b75f5203e154031049 (diff)
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.c15
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){