Mercurial > libavcodec.hg
changeset 2150:8aff375a986b libavcodec
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
author | michael |
---|---|
date | Tue, 27 Jul 2004 17:38:53 +0000 |
parents | 48dc4ec06e88 |
children | 44c973bfec0f |
files | snow.c |
diffstat | 1 files changed, 35 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/snow.c Tue Jul 27 17:02:31 2004 +0000 +++ b/snow.c Tue Jul 27 17:38:53 2004 +0000 @@ -1801,29 +1801,33 @@ 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 @@ 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){