41 #define MAX_NOISE 4096
42 #define MAX_SHIFT 1024
43 #define MAX_RES (MAX_NOISE-MAX_SHIFT)
78 #define RAND_N(range) ((int) ((double)range*rand()/(RAND_MAX+1.0)))
94 noise[i]= (
RAND_N(strength) - strength/2)/6
95 +
patt[j%4]*strength*0.25/3;
97 noise[i]= (
RAND_N(strength) - strength/2)/3;
101 noise[i]= (
RAND_N(strength) - strength/2)/2
102 +
patt[j%4]*strength*0.25;
104 noise[i]=
RAND_N(strength) - strength/2;
108 double x1, x2, w, y1;
110 x1 = 2.0 * rand()/(float)RAND_MAX - 1.0;
111 x2 = 2.0 * rand()/(float)RAND_MAX - 1.0;
112 w = x1 * x1 + x2 * x2;
113 }
while ( w >= 1.0 );
115 w = sqrt( (-2.0 * log( w ) ) / w );
117 y1*= strength / sqrt(3.0);
120 y1 +=
patt[j%4]*strength*0.35;
122 if (y1<-128) y1=-128;
123 else if(y1> 127) y1= 127;
124 if (averaged) y1 /= 3.0;
132 for (j = 0; j < 3; j++)
155 "mov %3, %%"REG_a
" \n\t"
156 "pcmpeqb %%mm7, %%mm7 \n\t"
157 "psllw $15, %%mm7 \n\t"
158 "packsswb %%mm7, %%mm7 \n\t"
161 "movq (%0, %%"REG_a
"), %%mm0 \n\t"
162 "movq (%1, %%"REG_a
"), %%mm1 \n\t"
163 "pxor %%mm7, %%mm0 \n\t"
164 "paddsb %%mm1, %%mm0 \n\t"
165 "pxor %%mm7, %%mm0 \n\t"
166 "movq %%mm0, (%2, %%"REG_a
") \n\t"
167 "add $8, %%"REG_a
" \n\t"
169 ::
"r" (src+mmx_len),
"r" (noise+mmx_len),
"r" (dst+mmx_len),
"g" (-mmx_len)
173 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0);
184 "mov %3, %%"REG_a
" \n\t"
185 "pcmpeqb %%mm7, %%mm7 \n\t"
186 "psllw $15, %%mm7 \n\t"
187 "packsswb %%mm7, %%mm7 \n\t"
190 "movq (%0, %%"REG_a
"), %%mm0 \n\t"
191 "movq (%1, %%"REG_a
"), %%mm1 \n\t"
192 "pxor %%mm7, %%mm0 \n\t"
193 "paddsb %%mm1, %%mm0 \n\t"
194 "pxor %%mm7, %%mm0 \n\t"
195 "movntq %%mm0, (%2, %%"REG_a
") \n\t"
196 "add $8, %%"REG_a
" \n\t"
198 ::
"r" (src+mmx_len),
"r" (noise+mmx_len),
"r" (dst+mmx_len),
"g" (-mmx_len)
202 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0);
211 int v= src[i]+ noise[i];
212 if(v>255) dst[i]=255;
213 else if(v<0) dst[i]=0;
225 "mov %5, %%"REG_a
" \n\t"
228 "movq (%1, %%"REG_a
"), %%mm1 \n\t"
229 "movq (%0, %%"REG_a
"), %%mm0 \n\t"
230 "paddb (%2, %%"REG_a
"), %%mm1 \n\t"
231 "paddb (%3, %%"REG_a
"), %%mm1 \n\t"
232 "movq %%mm0, %%mm2 \n\t"
233 "movq %%mm1, %%mm3 \n\t"
234 "punpcklbw %%mm0, %%mm0 \n\t"
235 "punpckhbw %%mm2, %%mm2 \n\t"
236 "punpcklbw %%mm1, %%mm1 \n\t"
237 "punpckhbw %%mm3, %%mm3 \n\t"
238 "pmulhw %%mm0, %%mm1 \n\t"
239 "pmulhw %%mm2, %%mm3 \n\t"
240 "paddw %%mm1, %%mm1 \n\t"
241 "paddw %%mm3, %%mm3 \n\t"
242 "paddw %%mm0, %%mm1 \n\t"
243 "paddw %%mm2, %%mm3 \n\t"
244 "psrlw $8, %%mm1 \n\t"
245 "psrlw $8, %%mm3 \n\t"
246 "packuswb %%mm3, %%mm1 \n\t"
247 "movq %%mm1, (%4, %%"REG_a
") \n\t"
248 "add $8, %%"REG_a
" \n\t"
250 ::
"r" (src+mmx_len),
"r" (shift[0]+mmx_len),
"r" (shift[1]+mmx_len),
"r" (shift[2]+mmx_len),
251 "r" (dst+mmx_len),
"g" (-mmx_len)
256 int8_t *
shift2[3]={shift[0]+mmx_len, shift[1]+mmx_len, shift[2]+mmx_len};
264 int8_t *src2= (int8_t*)src;
268 const int n= shift[0][i] + shift[1][i] + shift[2][i];
269 dst[i]= src2[i]+((n*src2[i])>>7);
276 int8_t *noise= fp->
noise;
284 if(dstStride==srcStride)
fast_memcpy(dst, src, srcStride*height);
307 lineNoise(dst, src, noise, width, shift);
316 static int config(
struct vf_instance *vf,
318 unsigned int flags,
unsigned int outfmt){
325 if(mpi->
imgfmt!=vf->priv->outfmt)
return;
329 mpi->
planes[0]=vf->dmpi->planes[0];
330 mpi->
stride[0]=vf->dmpi->stride[0];
331 mpi->
width=vf->dmpi->width;
333 mpi->
planes[1]=vf->dmpi->planes[1];
334 mpi->
planes[2]=vf->dmpi->planes[2];
335 mpi->
stride[1]=vf->dmpi->stride[1];
336 mpi->
stride[2]=vf->dmpi->stride[2];
370 static void uninit(
struct vf_instance *vf){
371 if(!vf->priv)
return;
373 av_free(vf->priv->chromaParam.noise);
374 vf->priv->chromaParam.noise=
NULL;
376 av_free(vf->priv->lumaParam.noise);
377 vf->priv->lumaParam.noise=
NULL;
398 char *max= strchr(args,
':');
400 if(!max) max= args + strlen(args);
403 pos= strchr(args,
'u');
404 if(pos && pos<max) fp->
uniform=1;
405 pos= strchr(args,
't');
407 pos= strchr(args,
'h');
408 if(pos && pos<max) fp->
quality=1;
409 pos= strchr(args,
'p');
410 if(pos && pos<max) fp->
pattern=1;
411 pos= strchr(args,
'a');
437 char *arg2= strchr(args,
':');
468 "Michael Niedermayer",