summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/snow.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index 74ed242d26..3150443804 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){