提交 cbb1d2b1 编写于 作者: M Michael Niedermayer

replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()

Originally committed as revision 4129 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 99cd59e5
......@@ -1777,19 +1777,19 @@ static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, i
if(1){
int run;
int index=0;
int prev_index=-1;
int prev2_index=0;
int parent_index= 0;
int prev_parent_index= 0;
x_and_coeff *xc= b->x_coeff;
x_and_coeff *prev_xc= NULL;
x_and_coeff *prev2_xc= xc;
x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
x_and_coeff *prev_parent_xc= parent_xc;
run= get_symbol2(&s->c, b->state[1], 3);
for(y=0; y<h; y++){
int v=0;
int lt=0, t=0, rt=0;
if(y && b->x_coeff[prev_index].x == 0){
rt= b->x_coeff[prev_index].coeff;
if(y && prev_xc->x == 0){
rt= prev_xc->coeff;
}
for(x=0; x<w; x++){
int p=0;
......@@ -1798,19 +1798,19 @@ static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, i
lt= t; t= rt;
if(y){
if(b->x_coeff[prev_index].x <= x)
prev_index++;
if(b->x_coeff[prev_index].x == x + 1)
rt= b->x_coeff[prev_index].coeff;
if(prev_xc->x <= x)
prev_xc++;
if(prev_xc->x == x + 1)
rt= prev_xc->coeff;
else
rt=0;
}
if(parent){
if(x>>1 > parent->x_coeff[parent_index].x){
parent_index++;
if(parent_xc){
if(x>>1 > parent_xc->x){
parent_xc++;
}
if(x>>1 == parent->x_coeff[parent_index].x){
p= parent->x_coeff[parent_index].coeff;
if(x>>1 == parent_xc->x){
p= parent_xc->coeff;
}
}
if(/*ll|*/l|lt|t|rt|p){
......@@ -1821,8 +1821,8 @@ static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, i
v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
b->x_coeff[index].x=x;
b->x_coeff[index++].coeff= v;
xc->x=x;
(xc++)->coeff= v;
}
}else{
if(!run){
......@@ -1830,39 +1830,39 @@ static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, i
v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
b->x_coeff[index].x=x;
b->x_coeff[index++].coeff= v;
xc->x=x;
(xc++)->coeff= v;
}else{
int max_run;
run--;
v=0;
if(y) max_run= FFMIN(run, b->x_coeff[prev_index].x - x - 2);
if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
else max_run= FFMIN(run, w-x-1);
if(parent)
max_run= FFMIN(max_run, 2*parent->x_coeff[parent_index].x - x - 1);
if(parent_xc)
max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
x+= max_run;
run-= max_run;
}
}
}
b->x_coeff[index++].x= w+1; //end marker
prev_index= prev2_index;
prev2_index= index;
(xc++)->x= w+1; //end marker
prev_xc= prev2_xc;
prev2_xc= xc;
if(parent){
if(parent_xc){
if(y&1){
while(parent->x_coeff[parent_index].x != parent->width+1)
parent_index++;
parent_index++;
prev_parent_index= parent_index;
while(parent_xc->x != parent->width+1)
parent_xc++;
parent_xc++;
prev_parent_xc= parent_xc;
}else{
parent_index= prev_parent_index;
parent_xc= prev_parent_xc;
}
}
}
b->x_coeff[index++].x= w+1; //end marker
(xc++)->x= w+1; //end marker
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册