Mercurial > mplayer.hg
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); |