diff options
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/snow.c | 63 |
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){ |