comparison libmpcodecs/vf_yadif.c @ 18623:960cd1af26f2

cleanup
author michael
date Wed, 07 Jun 2006 14:43:34 +0000
parents 0001a9a9f1a9
children dea3a68e2589
comparison
equal deleted inserted replaced
18622:dd9a6e8005f3 18623:960cd1af26f2
63 memcpy_pic(p->ref[1][i], src[i], width>>is_chroma, height>>is_chroma, p->stride[i], src_stride[i]); 63 memcpy_pic(p->ref[1][i], src[i], width>>is_chroma, height>>is_chroma, p->stride[i], src_stride[i]);
64 } 64 }
65 } 65 }
66 66
67 static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height, int parity, int tff){ 67 static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height, int parity, int tff){
68 int x, y, i, j, k; 68 int x, y, i, j;
69 69
70 for(i=0; i<3; i++){ 70 for(i=0; i<3; i++){
71 int is_chroma= !!i; 71 int is_chroma= !!i;
72 int w= width >>is_chroma; 72 int w= width >>is_chroma;
73 int h= height>>is_chroma; 73 int h= height>>is_chroma;
85 uint8_t *next= &src[i][x + y*srcs]; 85 uint8_t *next= &src[i][x + y*srcs];
86 uint8_t *prev2= (tff ^ parity) ? prev : cur ; 86 uint8_t *prev2= (tff ^ parity) ? prev : cur ;
87 uint8_t *next2= (tff ^ parity) ? cur : next; 87 uint8_t *next2= (tff ^ parity) ? cur : next;
88 int next2s= (tff ^ parity) ? refs : srcs; 88 int next2s= (tff ^ parity) ? refs : srcs;
89 89
90 int c= cur[-refs];
91 int d= (prev2[0] + next2[0])>>1;
92 int e= cur[+refs];
90 int temporal_diff0= ABS(prev2[0] - next2[0]); 93 int temporal_diff0= ABS(prev2[0] - next2[0]);
91 int temporal_diff1=( ABS(prev[-refs] - cur[-refs]) + ABS(prev[+refs] - cur[+refs]) )>>1; 94 int temporal_diff1=( ABS(prev[-refs] - c) + ABS(prev[+refs] - e) )>>1;
92 int temporal_diff2=( ABS(next[-srcs] - cur[-refs]) + ABS(next[+srcs] - cur[+refs]) )>>1; 95 int temporal_diff2=( ABS(next[-srcs] - c) + ABS(next[+srcs] - e) )>>1;
93 int diff= MAX3(temporal_diff0>>1, temporal_diff1, temporal_diff2); 96 int diff= MAX3(temporal_diff0>>1, temporal_diff1, temporal_diff2);
94 int temporal_pred= (prev2[0] + next2[0])>>1; 97 int spatial_pred= (c+e)>>1;
95 int spatial_pred= 0; 98 int spatial_score= ABS(cur[-refs-1] - cur[+refs-1]) + ABS(c-e)
96 int spatial_score= 1<<30; 99 + ABS(cur[-refs+1] - cur[+refs+1]);
97 int v= temporal_pred; 100
98 101 for(j=-1; j<=1; j+=2){
99 for(j=-1; j<=1; j++){
100 int score= ABS(cur[-refs-1+j] - cur[+refs-1-j]) 102 int score= ABS(cur[-refs-1+j] - cur[+refs-1-j])
101 + ABS(cur[-refs +j] - cur[+refs -j]) 103 + ABS(cur[-refs +j] - cur[+refs -j])
102 + ABS(cur[-refs+1+j] - cur[+refs+1-j]) 104 + ABS(cur[-refs+1+j] - cur[+refs+1-j]) + 1;
103 + ABS(j);
104 105
105 if(score < spatial_score){ 106 if(score < spatial_score){
106 spatial_score= score; 107 spatial_score= score;
107 spatial_pred= (cur[-refs +j] + cur[+refs -j])>>1; 108 spatial_pred= (cur[-refs +j] + cur[+refs -j])>>1;
108 } 109 }
109 } 110 }
110 if(y>1 && y+2<h){ 111 if(y>1 && y+2<h){
111 int b= (prev2[-2*refs] + next2[-2*next2s])>>1; 112 int b= (prev2[-2*refs] + next2[-2*next2s])>>1;
112 int c= cur[-refs];
113 int d= temporal_pred;
114 int e= cur[+refs];
115 int f= (prev2[+2*refs] + next2[+2*next2s])>>1; 113 int f= (prev2[+2*refs] + next2[+2*next2s])>>1;
116 #if 0 114 #if 0
117 int a= y>2 ? cur[-3*refs] : 0; 115 int a= y>2 ? cur[-3*refs] : 0;
118 int g= y+3<h ? cur[+3*refs] : 0; 116 int g= y+3<h ? cur[+3*refs] : 0;
119 int max= MAX3(d-e, d-c, MIN3(MAX(b-c,f-e),MAX(b-c,b-a),MAX(f-g,f-e)) ); 117 int max= MAX3(d-e, d-c, MIN3(MAX(b-c,f-e),MAX(b-c,b-a),MAX(f-g,f-e)) );
124 #endif 122 #endif
125 123
126 diff= MAX3(diff, min, -max); 124 diff= MAX3(diff, min, -max);
127 } 125 }
128 126
129 if(v < spatial_pred) v= MIN(v + diff, spatial_pred); 127 if(d < spatial_pred) d= MIN(d + diff, spatial_pred);
130 else v= MAX(v - diff, spatial_pred); 128 else d= MAX(d - diff, spatial_pred);
131 129
132 dst[i][x + y*dst_stride[i]]= v; 130 dst[i][x + y*dst_stride[i]]= d;
133 }else 131 }else
134 dst[i][x + y*dst_stride[i]]= p->ref[1][i][x + y*refs]; 132 dst[i][x + y*dst_stride[i]]= p->ref[1][i][x + y*refs];
135 } 133 }
136 }else{ 134 }else{
137 memcpy(&dst[i][y*dst_stride[i]], &p->ref[1][i][y*refs], w); 135 memcpy(&dst[i][y*dst_stride[i]], &p->ref[1][i][y*refs], w);