remove ugly and slow vertical scaning code
0.1% bitrate increase (foreman@352x288 qp=1)
0.3% bitrate increase (foreman@352x288 qp=8)

Originally committed as revision 3353 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 20 years ago
parent 7848640356
commit a8d73e56e6
  1. 264
      libavcodec/snow.c

@ -1278,8 +1278,8 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
const int w= b->width;
const int h= b->height;
int x, y;
#if 1
#if 0
if(orientation==3 && parent && 0){
int16_t candidate[w*h][2];
uint8_t state[w*h];
@ -1401,52 +1401,35 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
}
#endif
if(1){
int w, h;
int run=0;
int last_run=0;
int last_v=1;
int last_x=0;
int runs[b->width*b->height];
int runs[w*h];
int run_index=0;
if(orientation==1){
w= b->height;
h= b->width;
}else{
w= b->width;
h= b->height;
}
for(y=0; y<h; y++){
for(x=0; x<w; x++){
int v, p=0;
int /*ll=0, */l=0, lt=0, t=0, rt=0;
if(orientation==1) v= src[y + x*stride];
else v= src[x + y*stride];
v= src[x + y*stride];
if(y){
if(orientation==1) t= src[y - 1 + x*stride];
else t= src[x + (y-1)*stride];
t= src[x + (y-1)*stride];
if(x){
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
else lt= src[x - 1 + (y-1)*stride];
lt= src[x - 1 + (y-1)*stride];
}
if(x + 1 < w){
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
else rt= src[x + 1 + (y-1)*stride];
rt= src[x + 1 + (y-1)*stride];
}
}
if(x){
if(orientation==1) l= src[y + (x-1)*stride];
else l= src[x - 1 + y*stride];
l= src[x - 1 + y*stride];
/*if(x > 1){
if(orientation==1) ll= src[y + (x-2)*stride];
else ll= src[x - 2 + y*stride];
}*/
}
if(parent){
int px= (orientation==1 ? y : x)>>1;
int py= (orientation==1 ? x : y)>>1;
int px= x>>1;
int py= y>>1;
if(px<b->parent->width && py<b->parent->height)
p= parent[px + py*2*stride];
}
@ -1470,32 +1453,27 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
for(x=0; x<w; x++){
int v, p=0;
int /*ll=0, */l=0, lt=0, t=0, rt=0;
if(orientation==1) v= src[y + x*stride];
else v= src[x + y*stride];
v= src[x + y*stride];
if(y){
if(orientation==1) t= src[y - 1 + x*stride];
else t= src[x + (y-1)*stride];
t= src[x + (y-1)*stride];
if(x){
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
else lt= src[x - 1 + (y-1)*stride];
lt= src[x - 1 + (y-1)*stride];
}
if(x + 1 < w){
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
else rt= src[x + 1 + (y-1)*stride];
rt= src[x + 1 + (y-1)*stride];
}
}
if(x){
if(orientation==1) l= src[y + (x-1)*stride];
else l= src[x - 1 + y*stride];
l= src[x - 1 + y*stride];
/*if(x > 1){
if(orientation==1) ll= src[y + (x-2)*stride];
else ll= src[x - 2 + y*stride];
}*/
}
if(parent){
int px= (orientation==1 ? y : x)>>1;
int py= (orientation==1 ? x : y)>>1;
int px= x>>1;
int py= y>>1;
if(px<b->parent->width && py<b->parent->height)
p= parent[px + py*2*stride];
}
@ -1523,111 +1501,9 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
}
return;
}
if(1){
int w, h;
int run=0;
int last_run=0;
int last_v=1;
int last_x=0;
if(orientation==1){
w= b->height;
h= b->width;
}else{
w= b->width;
h= b->height;
}
for(y=0; y<h; y++){
for(x=0; x<w; x++){
int v, p;
if(orientation==1) v= src[y + x*stride];
else v= src[x + y*stride];
if(v){
int sec=0, pri=0/*, lt=0, rt=0, pri2=0*/;
if(y){
if(orientation==1) sec= src[y - 1 + x*stride];
else sec= src[x + (y-1)*stride];
/* if(x){
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
else lt= src[x - 1 + (y-1)*stride];
}*/
}
/* if (orientation==1 && y + 1 < h && x) rt= src[y + 1 + (x-1)*stride];
else if (orientation!=1 && x + 1 < w && y) rt= src[x + 1 + (y-1)*stride];*/
if(x){
if(orientation==1) pri= src[y + (x-1)*stride];
else pri= src[x - 1 + y*stride];
/* if(x > 1){
if(orientation==1) pri2= src[y + (x-2)*stride];
else pri2= src[x - 2 + y*stride];
}*/
}
put_symbol(&s->c, b->state[ABS(quant7[last_v&0xFF])], run, 0);
// context= 3*7 + 3 + quant11[last_v&0xFF] /*+ 7*quant3[(run-1)&0xFF]*/;
// if(parent && orientation!=1) context += 3*7+7*quant3[parent[(x>>1) + (y>>1)*2*stride]&0xFF];
// put_symbol(&s->c, b->state[ABS(quant7[pri&0xFF]) + 4*ABS(quant7[sec&0xFF]) + 8], ABS(v)-1, 0);
put_symbol(&s->c, b->state[quant13[(ABS(pri) + ABS(sec))&0x7F] + 8], ABS(v)-1, 0);
// context= quant3b[sec&0xFF] + 3*quant3b[pri&0xFF];
// put_cabac(&s->c, &b->state[7][ABS(context)], (v^context)<0);
put_cabac(&s->c, &b->state[7][1 + 3 + quant3b[sec&0xFF] + 3*quant3b[pri&0xFF]], v<0);
last_run=run;
last_v=v;
run=0;
}else{
run++;
}
}
}
if(run){
put_symbol(&s->c, b->state[ABS(quant7[last_v&0xFF])], run, 0);
}
return;
}
{
int run=0;
int mode=1;
for(y=0; y<h; y++){
for(x=0; x<w; x++){
// int context=5*11*11 + 5*11+5;
int context=3*7 + 3 + 1;
int v= src[x + y*stride];
if(mode){
if(v){
put_symbol(&s->c, b->state[0], run, 0);
mode=0;
run=0;
}else{
run++;
continue;
}
}
if(x /*&& orientation!=1*/) context += quant7[src[x-1 + y*stride ]&0xFF];
if(y /*&& orientation!=2*/) context += 7*quant7[src[x + y*stride-stride]&0xFF];
// if(x>1) context += 11*11*quant3 [src[x-2 + y*stride ]&0xFF];
// if(parent) context += 11*11*quant3[parent[(x>>1) + (y>>1)*2*stride]&0xFF];
put_symbol(&s->c, b->state[context], v, 1);
if(v==0){
mode=1;
}
}
}
if(mode && run)
put_symbol(&s->c, b->state[0], run, 0);
}
}
static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
const int level= b->level;
const int w= b->width;
const int h= b->height;
@ -1636,21 +1512,11 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
START_TIMER
if(1){
int w,h;
int run;
int last_run;
for(y=0; y<b->height; y++)
memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
if(orientation==1){
w= b->height;
h= b->width;
}else{
w= b->width;
h= b->height;
}
x=y=0;
run= get_symbol(&s->c, b->state[1], 0);
for(y=0; y<h; y++){
for(x=0; x<w; x++){
@ -1658,28 +1524,24 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
int /*ll=0, */l=0, lt=0, t=0, rt=0;
if(y){
if(orientation==1) t= src[y - 1 + x*stride];
else t= src[x + (y-1)*stride];
t= src[x + (y-1)*stride];
if(x){
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
else lt= src[x - 1 + (y-1)*stride];
lt= src[x - 1 + (y-1)*stride];
}
if(x + 1 < w){
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
else rt= src[x + 1 + (y-1)*stride];
rt= src[x + 1 + (y-1)*stride];
}
}
if(x){
if(orientation==1) l= src[y + (x-1)*stride];
else l= src[x - 1 + y*stride];
l= src[x - 1 + y*stride];
/*if(x > 1){
if(orientation==1) ll= src[y + (x-2)*stride];
else ll= src[x - 2 + y*stride];
}*/
}
if(parent){
int px= (orientation==1 ? y : x)>>1;
int py= (orientation==1 ? x : y)>>1;
int px= x>>1;
int py= y>>1;
if(px<b->parent->width && py<b->parent->height)
p= parent[px + py*2*stride];
}
@ -1703,8 +1565,7 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
v= get_symbol(&s->c, b->state[context + 2], 0) + 1;
if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]]))
v= -v;
if(orientation==1) src[y + x*stride]= v;
else src[x + y*stride]= v;
src[x + y*stride]= v;
}
}
}
@ -1714,81 +1575,6 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
return;
}
if(1){
int w,h;
int last_run=0;
int last_v=1;
for(y=0; y<b->height; y++)
memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
if(orientation==1){
w= b->height;
h= b->width;
}else{
w= b->width;
h= b->height;
}
x=y=0;
for(;;){
int sec=0, pri=0/*, lt=0, rt=0, pri2=0*/;
last_run= get_symbol(&s->c, b->state[ABS(quant7[last_v&0xFF])], 0);
// context= 3*7 + 3 + quant7[last_v&0xFF]/* + 7*quant7[(last_run-1)&0xFF]*/;
x += last_run;
while(x>=w){
x-= w;
if(++y>=h) break;
/* if(orientation!=1)
memset(&src[y*stride], 0, w*sizeof(DWTELEM));*/
}
if(y>=h) break;
if(y){
if(orientation==1) sec= src[y - 1 + x*stride];
else sec= src[x + (y-1)*stride];
/* if(x){
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
else lt= src[x - 1 + (y-1)*stride];
}*/
}
/* if (orientation==1 && y + 1 < h && x) rt= src[y + 1 + (x-1)*stride];
else if (orientation!=1 && x + 1 < w && y) rt= src[x + 1 + (y-1)*stride];*/
if(x){
if(orientation==1) pri= src[y + (x-1)*stride];
else pri= src[x - 1 + y*stride];
/* if(x > 1){
if(orientation==1) pri2= src[y + (x-2)*stride];
else pri2= src[x - 2 + y*stride];
}*/
}
last_v= get_symbol(&s->c, b->state[quant13[(ABS(pri) + ABS(sec))&0x7F] + 8], 0) + 1;
if(get_cabac(&s->c, &b->state[7][1 + 3 + quant3b[sec&0xFF] + 3*quant3b[pri&0xFF]]))
last_v= -last_v;
if(orientation==1) src[y + x*stride]= last_v;
else src[x + y*stride]= last_v;
if(++x==w){
x=0;
if(++y>=h) break;
/* if(orientation!=1)
memset(&src[y*stride], 0, w*sizeof(DWTELEM));*/
}
}
if(level+1 == s->spatial_decomposition_count){
STOP_TIMER("decode_subband")
}
return;
}
}
static void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
if(orientation==1) decode_subbandX(s, b, src, parent, stride, 1);
else decode_subbandX(s, b, src, parent, stride, 0);
}
static void reset_contexts(SnowContext *s){

Loading…
Cancel
Save