optimize quantizaton (about 3x faster)
[libav.git] / libavcodec / snow.c
index 74ed242..3150443 100644 (file)
@@ -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){