cleanup
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
This commit is contained in:
parent
7848640356
commit
a8d73e56e6
@ -1278,8 +1278,8 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
|
|||||||
const int w= b->width;
|
const int w= b->width;
|
||||||
const int h= b->height;
|
const int h= b->height;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
if(orientation==3 && parent && 0){
|
if(orientation==3 && parent && 0){
|
||||||
int16_t candidate[w*h][2];
|
int16_t candidate[w*h][2];
|
||||||
uint8_t state[w*h];
|
uint8_t state[w*h];
|
||||||
@ -1401,52 +1401,35 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(1){
|
if(1){
|
||||||
int w, h;
|
|
||||||
int run=0;
|
int run=0;
|
||||||
int last_run=0;
|
int runs[w*h];
|
||||||
int last_v=1;
|
|
||||||
int last_x=0;
|
|
||||||
int runs[b->width*b->height];
|
|
||||||
int run_index=0;
|
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(y=0; y<h; y++){
|
||||||
for(x=0; x<w; x++){
|
for(x=0; x<w; x++){
|
||||||
int v, p=0;
|
int v, p=0;
|
||||||
int /*ll=0, */l=0, lt=0, t=0, rt=0;
|
int /*ll=0, */l=0, lt=0, t=0, rt=0;
|
||||||
if(orientation==1) v= src[y + x*stride];
|
v= src[x + y*stride];
|
||||||
else v= src[x + y*stride];
|
|
||||||
|
|
||||||
if(y){
|
if(y){
|
||||||
if(orientation==1) t= src[y - 1 + x*stride];
|
t= src[x + (y-1)*stride];
|
||||||
else t= src[x + (y-1)*stride];
|
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
|
lt= src[x - 1 + (y-1)*stride];
|
||||||
else lt= src[x - 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
if(x + 1 < w){
|
if(x + 1 < w){
|
||||||
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
|
rt= src[x + 1 + (y-1)*stride];
|
||||||
else rt= src[x + 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) l= src[y + (x-1)*stride];
|
l= src[x - 1 + y*stride];
|
||||||
else l= src[x - 1 + y*stride];
|
|
||||||
/*if(x > 1){
|
/*if(x > 1){
|
||||||
if(orientation==1) ll= src[y + (x-2)*stride];
|
if(orientation==1) ll= src[y + (x-2)*stride];
|
||||||
else ll= src[x - 2 + y*stride];
|
else ll= src[x - 2 + y*stride];
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
if(parent){
|
if(parent){
|
||||||
int px= (orientation==1 ? y : x)>>1;
|
int px= x>>1;
|
||||||
int py= (orientation==1 ? x : y)>>1;
|
int py= y>>1;
|
||||||
if(px<b->parent->width && py<b->parent->height)
|
if(px<b->parent->width && py<b->parent->height)
|
||||||
p= parent[px + py*2*stride];
|
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++){
|
for(x=0; x<w; x++){
|
||||||
int v, p=0;
|
int v, p=0;
|
||||||
int /*ll=0, */l=0, lt=0, t=0, rt=0;
|
int /*ll=0, */l=0, lt=0, t=0, rt=0;
|
||||||
if(orientation==1) v= src[y + x*stride];
|
v= src[x + y*stride];
|
||||||
else v= src[x + y*stride];
|
|
||||||
|
|
||||||
if(y){
|
if(y){
|
||||||
if(orientation==1) t= src[y - 1 + x*stride];
|
t= src[x + (y-1)*stride];
|
||||||
else t= src[x + (y-1)*stride];
|
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
|
lt= src[x - 1 + (y-1)*stride];
|
||||||
else lt= src[x - 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
if(x + 1 < w){
|
if(x + 1 < w){
|
||||||
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
|
rt= src[x + 1 + (y-1)*stride];
|
||||||
else rt= src[x + 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) l= src[y + (x-1)*stride];
|
l= src[x - 1 + y*stride];
|
||||||
else l= src[x - 1 + y*stride];
|
|
||||||
/*if(x > 1){
|
/*if(x > 1){
|
||||||
if(orientation==1) ll= src[y + (x-2)*stride];
|
if(orientation==1) ll= src[y + (x-2)*stride];
|
||||||
else ll= src[x - 2 + y*stride];
|
else ll= src[x - 2 + y*stride];
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
if(parent){
|
if(parent){
|
||||||
int px= (orientation==1 ? y : x)>>1;
|
int px= x>>1;
|
||||||
int py= (orientation==1 ? x : y)>>1;
|
int py= y>>1;
|
||||||
if(px<b->parent->width && py<b->parent->height)
|
if(px<b->parent->width && py<b->parent->height)
|
||||||
p= parent[px + py*2*stride];
|
p= parent[px + py*2*stride];
|
||||||
}
|
}
|
||||||
@ -1523,111 +1501,9 @@ static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *pa
|
|||||||
}
|
}
|
||||||
return;
|
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 level= b->level;
|
||||||
const int w= b->width;
|
const int w= b->width;
|
||||||
const int h= b->height;
|
const int h= b->height;
|
||||||
@ -1636,21 +1512,11 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
|
|||||||
START_TIMER
|
START_TIMER
|
||||||
|
|
||||||
if(1){
|
if(1){
|
||||||
int w,h;
|
|
||||||
int run;
|
int run;
|
||||||
int last_run;
|
|
||||||
|
|
||||||
for(y=0; y<b->height; y++)
|
for(y=0; y<b->height; y++)
|
||||||
memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
|
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);
|
run= get_symbol(&s->c, b->state[1], 0);
|
||||||
for(y=0; y<h; y++){
|
for(y=0; y<h; y++){
|
||||||
for(x=0; x<w; x++){
|
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;
|
int /*ll=0, */l=0, lt=0, t=0, rt=0;
|
||||||
|
|
||||||
if(y){
|
if(y){
|
||||||
if(orientation==1) t= src[y - 1 + x*stride];
|
t= src[x + (y-1)*stride];
|
||||||
else t= src[x + (y-1)*stride];
|
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) lt= src[y - 1 + (x-1)*stride];
|
lt= src[x - 1 + (y-1)*stride];
|
||||||
else lt= src[x - 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
if(x + 1 < w){
|
if(x + 1 < w){
|
||||||
if(orientation==1) rt= src[y - 1 + (x+1)*stride];
|
rt= src[x + 1 + (y-1)*stride];
|
||||||
else rt= src[x + 1 + (y-1)*stride];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(x){
|
if(x){
|
||||||
if(orientation==1) l= src[y + (x-1)*stride];
|
l= src[x - 1 + y*stride];
|
||||||
else l= src[x - 1 + y*stride];
|
|
||||||
/*if(x > 1){
|
/*if(x > 1){
|
||||||
if(orientation==1) ll= src[y + (x-2)*stride];
|
if(orientation==1) ll= src[y + (x-2)*stride];
|
||||||
else ll= src[x - 2 + y*stride];
|
else ll= src[x - 2 + y*stride];
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
if(parent){
|
if(parent){
|
||||||
int px= (orientation==1 ? y : x)>>1;
|
int px= x>>1;
|
||||||
int py= (orientation==1 ? x : y)>>1;
|
int py= y>>1;
|
||||||
if(px<b->parent->width && py<b->parent->height)
|
if(px<b->parent->width && py<b->parent->height)
|
||||||
p= parent[px + py*2*stride];
|
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;
|
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]]))
|
if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]]))
|
||||||
v= -v;
|
v= -v;
|
||||||
if(orientation==1) src[y + x*stride]= v;
|
src[x + y*stride]= v;
|
||||||
else src[x + y*stride]= v;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1714,81 +1575,6 @@ static inline void decode_subbandX(SnowContext *s, SubBand *b, DWTELEM *src, DWT
|
|||||||
|
|
||||||
return;
|
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){
|
static void reset_contexts(SnowContext *s){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user