[SCM] libav/experimental: ff_copy_bits() optimization

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:39:12 UTC 2013


The following commit has been merged in the experimental branch:
commit b6335c9f5ba92a87dad33f2ccd292ff37b397afa
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Sat Feb 14 01:25:41 2004 +0000

    ff_copy_bits() optimization
    
    Originally committed as revision 2777 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 6c483dc..519fa5c 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){

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list