comparison libmpcodecs/vf_unsharp.c @ 32702:7af3e6f901fd

Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
author cehoyos
date Fri, 14 Jan 2011 22:10:21 +0000
parents 8fa2f43cb760
children c4287381e2ea
comparison
equal deleted inserted replaced
32701:02bc7c860503 32702:7af3e6f901fd
81 int stepsY = fp->msizeY/2; 81 int stepsY = fp->msizeY/2;
82 int scalebits = (stepsX+stepsY)*2; 82 int scalebits = (stepsX+stepsY)*2;
83 int32_t halfscale = 1 << ((stepsX+stepsY)*2-1); 83 int32_t halfscale = 1 << ((stepsX+stepsY)*2-1);
84 84
85 if( !fp->amount ) { 85 if( !fp->amount ) {
86 if( src == dst ) 86 if( src == dst )
87 return; 87 return;
88 if( dstStride == srcStride ) 88 if( dstStride == srcStride )
89 fast_memcpy( dst, src, srcStride*height ); 89 fast_memcpy( dst, src, srcStride*height );
90 else 90 else
91 for( y=0; y<height; y++, dst+=dstStride, src+=srcStride ) 91 for( y=0; y<height; y++, dst+=dstStride, src+=srcStride )
92 fast_memcpy( dst, src, width ); 92 fast_memcpy( dst, src, width );
93 return; 93 return;
94 } 94 }
95 95
96 for( y=0; y<2*stepsY; y++ ) 96 for( y=0; y<2*stepsY; y++ )
97 memset( SC[y], 0, sizeof(SC[y][0]) * (width+2*stepsX) ); 97 memset( SC[y], 0, sizeof(SC[y][0]) * (width+2*stepsX) );
98 98
99 for( y=-stepsY; y<height+stepsY; y++ ) { 99 for( y=-stepsY; y<height+stepsY; y++ ) {
100 if( y < height ) src2 = src; 100 if( y < height ) src2 = src;
101 memset( SR, 0, sizeof(SR[0]) * (2*stepsX-1) ); 101 memset( SR, 0, sizeof(SR[0]) * (2*stepsX-1) );
102 for( x=-stepsX; x<width+stepsX; x++ ) { 102 for( x=-stepsX; x<width+stepsX; x++ ) {
103 Tmp1 = x<=0 ? src2[0] : x>=width ? src2[width-1] : src2[x]; 103 Tmp1 = x<=0 ? src2[0] : x>=width ? src2[width-1] : src2[x];
104 for( z=0; z<stepsX*2; z+=2 ) { 104 for( z=0; z<stepsX*2; z+=2 ) {
105 Tmp2 = SR[z+0] + Tmp1; SR[z+0] = Tmp1; 105 Tmp2 = SR[z+0] + Tmp1; SR[z+0] = Tmp1;
106 Tmp1 = SR[z+1] + Tmp2; SR[z+1] = Tmp2; 106 Tmp1 = SR[z+1] + Tmp2; SR[z+1] = Tmp2;
107 } 107 }
108 for( z=0; z<stepsY*2; z+=2 ) { 108 for( z=0; z<stepsY*2; z+=2 ) {
109 Tmp2 = SC[z+0][x+stepsX] + Tmp1; SC[z+0][x+stepsX] = Tmp1; 109 Tmp2 = SC[z+0][x+stepsX] + Tmp1; SC[z+0][x+stepsX] = Tmp1;
110 Tmp1 = SC[z+1][x+stepsX] + Tmp2; SC[z+1][x+stepsX] = Tmp2; 110 Tmp1 = SC[z+1][x+stepsX] + Tmp2; SC[z+1][x+stepsX] = Tmp2;
111 } 111 }
112 if( x>=stepsX && y>=stepsY ) { 112 if( x>=stepsX && y>=stepsY ) {
113 uint8_t* srx = src - stepsY*srcStride + x - stepsX; 113 uint8_t* srx = src - stepsY*srcStride + x - stepsX;
114 uint8_t* dsx = dst - stepsY*dstStride + x - stepsX; 114 uint8_t* dsx = dst - stepsY*dstStride + x - stepsX;
115 115
116 res = (int32_t)*srx + ( ( ( (int32_t)*srx - (int32_t)((Tmp1+halfscale) >> scalebits) ) * amount ) >> 16 ); 116 res = (int32_t)*srx + ( ( ( (int32_t)*srx - (int32_t)((Tmp1+halfscale) >> scalebits) ) * amount ) >> 16 );
117 *dsx = res>255 ? 255 : res<0 ? 0 : (uint8_t)res; 117 *dsx = res>255 ? 255 : res<0 ? 0 : (uint8_t)res;
118 } 118 }
119 } 119 }
120 if( y >= 0 ) { 120 if( y >= 0 ) {
121 dst += dstStride; 121 dst += dstStride;
122 src += srcStride; 122 src += srcStride;
123 } 123 }
124 } 124 }
125 } 125 }
126 126
127 //===========================================================================// 127 //===========================================================================//
128 128
129 static int config( struct vf_instance *vf, 129 static int config( struct vf_instance *vf,
130 int width, int height, int d_width, int d_height, 130 int width, int height, int d_width, int d_height,
131 unsigned int flags, unsigned int outfmt ) { 131 unsigned int flags, unsigned int outfmt ) {
132 132
133 int z, stepsX, stepsY; 133 int z, stepsX, stepsY;
134 FilterParam *fp; 134 FilterParam *fp;
135 char *effect; 135 char *effect;
136 136
141 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s luma) \n", fp->msizeX, fp->msizeY, fp->amount, effect ); 141 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s luma) \n", fp->msizeX, fp->msizeY, fp->amount, effect );
142 memset( fp->SC, 0, sizeof( fp->SC ) ); 142 memset( fp->SC, 0, sizeof( fp->SC ) );
143 stepsX = fp->msizeX/2; 143 stepsX = fp->msizeX/2;
144 stepsY = fp->msizeY/2; 144 stepsY = fp->msizeY/2;
145 for( z=0; z<2*stepsY; z++ ) 145 for( z=0; z<2*stepsY; z++ )
146 fp->SC[z] = av_malloc(sizeof(*(fp->SC[z])) * (width+2*stepsX)); 146 fp->SC[z] = av_malloc(sizeof(*(fp->SC[z])) * (width+2*stepsX));
147 147
148 fp = &vf->priv->chromaParam; 148 fp = &vf->priv->chromaParam;
149 effect = fp->amount == 0 ? "don't touch" : fp->amount < 0 ? "blur" : "sharpen"; 149 effect = fp->amount == 0 ? "don't touch" : fp->amount < 0 ? "blur" : "sharpen";
150 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s chroma)\n", fp->msizeX, fp->msizeY, fp->amount, effect ); 150 mp_msg( MSGT_VFILTER, MSGL_INFO, "unsharp: %dx%d:%0.2f (%s chroma)\n", fp->msizeX, fp->msizeY, fp->amount, effect );
151 memset( fp->SC, 0, sizeof( fp->SC ) ); 151 memset( fp->SC, 0, sizeof( fp->SC ) );
152 stepsX = fp->msizeX/2; 152 stepsX = fp->msizeX/2;
153 stepsY = fp->msizeY/2; 153 stepsY = fp->msizeY/2;
154 for( z=0; z<2*stepsY; z++ ) 154 for( z=0; z<2*stepsY; z++ )
155 fp->SC[z] = av_malloc(sizeof(*(fp->SC[z])) * (width+2*stepsX)); 155 fp->SC[z] = av_malloc(sizeof(*(fp->SC[z])) * (width+2*stepsX));
156 156
157 return vf_next_config( vf, width, height, d_width, d_height, flags, outfmt ); 157 return vf_next_config( vf, width, height, d_width, d_height, flags, outfmt );
158 } 158 }
159 159
160 //===========================================================================// 160 //===========================================================================//
161 161
162 static void get_image( struct vf_instance *vf, mp_image_t *mpi ) { 162 static void get_image( struct vf_instance *vf, mp_image_t *mpi ) {
163 if( mpi->flags & MP_IMGFLAG_PRESERVE ) 163 if( mpi->flags & MP_IMGFLAG_PRESERVE )
164 return; // don't change 164 return; // don't change
165 if( mpi->imgfmt!=vf->priv->outfmt ) 165 if( mpi->imgfmt!=vf->priv->outfmt )
166 return; // colorspace differ 166 return; // colorspace differ
167 167
168 vf->dmpi = vf_get_image( vf->next, mpi->imgfmt, mpi->type, mpi->flags, mpi->w, mpi->h ); 168 vf->dmpi = vf_get_image( vf->next, mpi->imgfmt, mpi->type, mpi->flags, mpi->w, mpi->h );
169 mpi->planes[0] = vf->dmpi->planes[0]; 169 mpi->planes[0] = vf->dmpi->planes[0];
170 mpi->stride[0] = vf->dmpi->stride[0]; 170 mpi->stride[0] = vf->dmpi->stride[0];
171 mpi->width = vf->dmpi->width; 171 mpi->width = vf->dmpi->width;
172 if( mpi->flags & MP_IMGFLAG_PLANAR ) { 172 if( mpi->flags & MP_IMGFLAG_PLANAR ) {
173 mpi->planes[1] = vf->dmpi->planes[1]; 173 mpi->planes[1] = vf->dmpi->planes[1];
174 mpi->planes[2] = vf->dmpi->planes[2]; 174 mpi->planes[2] = vf->dmpi->planes[2];
175 mpi->stride[1] = vf->dmpi->stride[1]; 175 mpi->stride[1] = vf->dmpi->stride[1];
176 mpi->stride[2] = vf->dmpi->stride[2]; 176 mpi->stride[2] = vf->dmpi->stride[2];
177 } 177 }
178 mpi->flags |= MP_IMGFLAG_DIRECT; 178 mpi->flags |= MP_IMGFLAG_DIRECT;
179 } 179 }
180 180
181 static int put_image( struct vf_instance *vf, mp_image_t *mpi, double pts) { 181 static int put_image( struct vf_instance *vf, mp_image_t *mpi, double pts) {
182 mp_image_t *dmpi; 182 mp_image_t *dmpi;
183 183
184 if( !(mpi->flags & MP_IMGFLAG_DIRECT) ) 184 if( !(mpi->flags & MP_IMGFLAG_DIRECT) )
185 // no DR, so get a new image! hope we'll get DR buffer: 185 // no DR, so get a new image! hope we'll get DR buffer:
186 vf->dmpi = vf_get_image( vf->next,vf->priv->outfmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, mpi->w, mpi->h); 186 vf->dmpi = vf_get_image( vf->next,vf->priv->outfmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, mpi->w, mpi->h);
187 dmpi= vf->dmpi; 187 dmpi= vf->dmpi;
188 188
189 unsharp( dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, &vf->priv->lumaParam ); 189 unsharp( dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, &vf->priv->lumaParam );
190 unsharp( dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w/2, mpi->h/2, &vf->priv->chromaParam ); 190 unsharp( dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w/2, mpi->h/2, &vf->priv->chromaParam );
191 unsharp( dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w/2, mpi->h/2, &vf->priv->chromaParam ); 191 unsharp( dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w/2, mpi->h/2, &vf->priv->chromaParam );
192 192
193 vf_clone_mpi_attributes(dmpi, mpi); 193 vf_clone_mpi_attributes(dmpi, mpi);
194 194
195 #if HAVE_MMX 195 #if HAVE_MMX
196 if(gCpuCaps.hasMMX) 196 if(gCpuCaps.hasMMX)
197 __asm__ volatile ("emms\n\t"); 197 __asm__ volatile ("emms\n\t");
198 #endif 198 #endif
199 #if HAVE_MMX2 199 #if HAVE_MMX2
200 if(gCpuCaps.hasMMX2) 200 if(gCpuCaps.hasMMX2)
201 __asm__ volatile ("sfence\n\t"); 201 __asm__ volatile ("sfence\n\t");
202 #endif 202 #endif
203 203
204 return vf_next_put_image( vf, dmpi, pts); 204 return vf_next_put_image( vf, dmpi, pts);
205 } 205 }
206 206
210 210
211 if( !vf->priv ) return; 211 if( !vf->priv ) return;
212 212
213 fp = &vf->priv->lumaParam; 213 fp = &vf->priv->lumaParam;
214 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) { 214 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
215 av_free( fp->SC[z] ); 215 av_free( fp->SC[z] );
216 fp->SC[z] = NULL; 216 fp->SC[z] = NULL;
217 } 217 }
218 fp = &vf->priv->chromaParam; 218 fp = &vf->priv->chromaParam;
219 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) { 219 for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
220 av_free( fp->SC[z] ); 220 av_free( fp->SC[z] );
221 fp->SC[z] = NULL; 221 fp->SC[z] = NULL;
222 } 222 }
223 223
224 free( vf->priv ); 224 free( vf->priv );
225 vf->priv = NULL; 225 vf->priv = NULL;
226 } 226 }
230 static int query_format( struct vf_instance *vf, unsigned int fmt ) { 230 static int query_format( struct vf_instance *vf, unsigned int fmt ) {
231 switch(fmt) { 231 switch(fmt) {
232 case IMGFMT_YV12: 232 case IMGFMT_YV12:
233 case IMGFMT_I420: 233 case IMGFMT_I420:
234 case IMGFMT_IYUV: 234 case IMGFMT_IYUV:
235 return vf_next_query_format( vf, vf->priv->outfmt ); 235 return vf_next_query_format( vf, vf->priv->outfmt );
236 } 236 }
237 return 0; 237 return 0;
238 } 238 }
239 239
240 //===========================================================================// 240 //===========================================================================//
278 vf->uninit = uninit; 278 vf->uninit = uninit;
279 vf->priv = malloc( sizeof(struct vf_priv_s) ); 279 vf->priv = malloc( sizeof(struct vf_priv_s) );
280 memset( vf->priv, 0, sizeof(struct vf_priv_s) ); 280 memset( vf->priv, 0, sizeof(struct vf_priv_s) );
281 281
282 if( args ) { 282 if( args ) {
283 char *args2 = strchr( args, 'l' ); 283 char *args2 = strchr( args, 'l' );
284 if( args2 ) 284 if( args2 )
285 parse( &vf->priv->lumaParam, args2 ); 285 parse( &vf->priv->lumaParam, args2 );
286 else { 286 else {
287 vf->priv->lumaParam.amount = 287 vf->priv->lumaParam.amount =
288 vf->priv->lumaParam.msizeX = 288 vf->priv->lumaParam.msizeX =
289 vf->priv->lumaParam.msizeY = 0; 289 vf->priv->lumaParam.msizeY = 0;
290 } 290 }
291 291
292 args2 = strchr( args, 'c' ); 292 args2 = strchr( args, 'c' );
293 if( args2 ) 293 if( args2 )
294 parse( &vf->priv->chromaParam, args2 ); 294 parse( &vf->priv->chromaParam, args2 );
295 else { 295 else {
296 vf->priv->chromaParam.amount = 296 vf->priv->chromaParam.amount =
297 vf->priv->chromaParam.msizeX = 297 vf->priv->chromaParam.msizeX =
298 vf->priv->chromaParam.msizeY = 0; 298 vf->priv->chromaParam.msizeY = 0;
299 } 299 }
300 300
301 if( !vf->priv->lumaParam.msizeX && !vf->priv->chromaParam.msizeX ) 301 if( !vf->priv->lumaParam.msizeX && !vf->priv->chromaParam.msizeX )
302 return 0; // nothing to do 302 return 0; // nothing to do
303 } 303 }
304 304
305 // check csp: 305 // check csp:
306 vf->priv->outfmt = vf_match_csp( &vf->next, fmt_list, IMGFMT_YV12 ); 306 vf->priv->outfmt = vf_match_csp( &vf->next, fmt_list, IMGFMT_YV12 );
307 if( !vf->priv->outfmt ) { 307 if( !vf->priv->outfmt ) {
308 uninit( vf ); 308 uninit( vf );
309 return 0; // no csp match :( 309 return 0; // no csp match :(
310 } 310 }
311 311
312 return 1; 312 return 1;
313 } 313 }