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
This commit is contained in:
parent
a8d73e56e6
commit
da66b6313e
@ -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){
|
||||
|
Loading…
x
Reference in New Issue
Block a user