[SCM] libav/experimental: optimize quantizaton (about 3x faster) further opt is easily possible but could lead to overflows depening upon coefficient range, so this wont be done yet as it would make the code somewhat less flexible

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:41:06 UTC 2013


The following commit has been merged in the experimental branch:
commit da66b6313e61a861321b7d62a3d12a38877784bb
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Tue Jul 27 17:38:53 2004 +0000

    optimize quantizaton (about 3x faster)
    further opt is easily possible but could lead to overflows depening upon coefficient range, so this wont be done yet as it would make the code somewhat less flexible
    
    Originally committed as revision 3354 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index 74ed242..3150443 100644
--- a/libavcodec/snow.c
+++ b/libavcodec/snow.c
@@ -1801,29 +1801,33 @@ static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int b
     const int h= b->height;
     const int qlog= clip(s->qlog + b->qlog, 0, 128);
     const int qmul= qexp[qlog&7]<<(qlog>>3);
-    int x,y;
+    int x,y, thres1, thres2;
+    START_TIMER
 
     assert(QROOT==8);
 
     bias= bias ? 0 : (3*qmul)>>3;
+    thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
+    thres2= 2*thres1;
     
     if(!bias){
         for(y=0; y<h; y++){
             for(x=0; x<w; x++){
-                int i= src[x + y*stride]; 
-                //FIXME use threshold
-                //FIXME optimize
-                //FIXME bias
-                if(i>=0){
-                    i<<= QEXPSHIFT;
-                    i/= qmul;
-                    src[x + y*stride]=  i;
-                }else{
-                    i= -i;
-                    i<<= QEXPSHIFT;
-                    i/= qmul;
-                    src[x + y*stride]= -i;
-                }
+                int i= src[x + y*stride];
+                
+                if((unsigned)(i+thres1) > thres2){
+                    if(i>=0){
+                        i<<= QEXPSHIFT;
+                        i/= qmul; //FIXME optimize
+                        src[x + y*stride]=  i;
+                    }else{
+                        i= -i;
+                        i<<= QEXPSHIFT;
+                        i/= qmul; //FIXME optimize
+                        src[x + y*stride]= -i;
+                    }
+                }else
+                    src[x + y*stride]= 0;
             }
         }
     }else{
@@ -1831,22 +1835,25 @@ static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int b
             for(x=0; x<w; x++){
                 int i= src[x + y*stride]; 
                 
-                //FIXME use threshold
-                //FIXME optimize
-                //FIXME bias
-                if(i>=0){
-                    i<<= QEXPSHIFT;
-                    i= (i + bias) / qmul;
-                    src[x + y*stride]=  i;
-                }else{
-                    i= -i;
-                    i<<= QEXPSHIFT;
-                    i= (i + bias) / qmul;
-                    src[x + y*stride]= -i;
-                }
+                if((unsigned)(i+thres1) > thres2){
+                    if(i>=0){
+                        i<<= QEXPSHIFT;
+                        i= (i + bias) / qmul; //FIXME optimize
+                        src[x + y*stride]=  i;
+                    }else{
+                        i= -i;
+                        i<<= QEXPSHIFT;
+                        i= (i + bias) / qmul; //FIXME optimize
+                        src[x + y*stride]= -i;
+                    }
+                }else
+                    src[x + y*stride]= 0;
             }
         }
     }
+    if(level+1 == s->spatial_decomposition_count){
+//        STOP_TIMER("quantize")
+    }
 }
 
 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list