1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-08 13:22:53 +02:00

11% faster decode_subband()

Originally committed as revision 3421 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2004-08-27 20:33:16 +00:00
parent 0cea8a037c
commit ff76515933

View File

@ -1921,8 +1921,8 @@ static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTE
int v=0; int v=0;
int lt=0, t=0, rt=0; int lt=0, t=0, rt=0;
if(y){ if(y && b->x[prev_index] == 0){
rt= src[(y-1)*stride]; rt= b->coeff[prev_index];
} }
for(x=0; x<w; x++){ for(x=0; x<w; x++){
int p=0; int p=0;
@ -1930,19 +1930,21 @@ static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTE
lt= t; t= rt; lt= t; t= rt;
if(y && x + 1 < w){ if(y){
rt= src[x + 1 + (y-1)*stride]; if(b->x[prev_index] <= x) //FIXME if
}else prev_index++;
rt= 0; if(b->x[prev_index] == x + 1)
rt= b->coeff[prev_index];
else
rt=0;
}
if(parent){ if(parent){
int px= x>>1;
int py= y>>1;
if(px<b->parent->width && py<b->parent->height)
p= parent[px + py*2*stride];
if(x>>1 > b->parent->x[parent_index]){ if(x>>1 > b->parent->x[parent_index]){
parent_index++; parent_index++;
} }
if(x>>1 == b->parent->x[parent_index]){
p= b->parent->coeff[parent_index];
}
} }
if(/*ll|*/l|lt|t|rt|p){ if(/*ll|*/l|lt|t|rt|p){
int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
@ -1958,8 +1960,6 @@ static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTE
if(y && parent){ if(y && parent){
int max_run; int max_run;
while(b->x[prev_index] < x)
prev_index++;
max_run= FFMIN(run, b->x[prev_index] - x - 2); max_run= FFMIN(run, b->x[prev_index] - x - 2);
max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1); max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1);
@ -1974,8 +1974,8 @@ static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTE
if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])) if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]]))
v= -v; v= -v;
src[x + y*stride]= v; src[x + y*stride]= v;
b->x[index++]=x; //FIXME interleave x/coeff b->x[index]=x; //FIXME interleave x/coeff
// b->coeff[index++]= v; b->coeff[index++]= v;
} }
} }
b->x[index++]= w+1; //end marker b->x[index++]= w+1; //end marker