@ -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 ) {