changeset 6990:857bae3001e8

semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
author michael
date Tue, 13 Aug 2002 17:53:32 +0000
parents b2ba67f6203e
children bd242a56b563
files DOCS/tech/vop.txt libmpcodecs/vf_noise.c
diffstat 2 files changed, 34 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/tech/vop.txt	Tue Aug 13 16:04:16 2002 +0000
+++ b/DOCS/tech/vop.txt	Tue Aug 13 17:53:32 2002 +0000
@@ -161,5 +161,6 @@
     t temporal noise (noise pattern changes between frames)
     a averaged temporal (smoother, but a lot slower)
     h high quality (slightly better looking, slightly slower)
+    p mix random noise with a (semi)regular pattern
     MPI: DR (if possible) or TEMP, accepts stride
 
--- a/libmpcodecs/vf_noise.c	Tue Aug 13 16:04:16 2002 +0000
+++ b/libmpcodecs/vf_noise.c	Tue Aug 13 17:53:32 2002 +0000
@@ -53,6 +53,7 @@
 	int temporal;
 	int quality;
         int averaged;
+        int pattern;
         int shiftptr;
 	int8_t *noise;
 	int8_t *prev_shift[MAX_RES][3];
@@ -67,40 +68,60 @@
 
 static int nonTempRandShift[MAX_RES]= {-1};
 
+static int patt[4] = {
+    -1,0,1,0
+};
+
+#define RAND_N(range) ((int) ((double)range*rand()/(RAND_MAX+1.0)))
 static int8_t *initNoise(FilterParam *fp){
 	int strength= fp->strength;
 	int uniform= fp->uniform;
 	int averaged= fp->averaged;
+	int pattern= fp->pattern;
 	int8_t *noise= memalign(16, MAX_NOISE*sizeof(int8_t));
 	int i, j;
 
 	srand(123457);
 
-	for(i=0; i<MAX_NOISE; i++)
+	for(i=0,j=0; i<MAX_NOISE; i++,j++)
 	{
-	        if(uniform) {
-		        if (averaged) {
-			        noise[i]= (((rand()/11)%strength) - strength/2)/3;
-		        } else {
-			        noise[i]= ((rand()/11)%strength) - strength/2;
-		        }
-                } else {
+		if(uniform) {
+			if (averaged) {
+		    		if (pattern) {
+					noise[i]= (RAND_N(strength) - strength/2)/6
+						+patt[j%4]*strength*0.25/3;
+				} else {
+					noise[i]= (RAND_N(strength) - strength/2)/3;
+		    		}
+			} else {
+		    		if (pattern) {
+				    noise[i]= (RAND_N(strength) - strength/2)/2
+					    + patt[j%4]*strength*0.25;
+				} else {
+					noise[i]= RAND_N(strength) - strength/2;
+		    		}
+			}
+	    	} else {
 			double x1, x2, w, y1;
 			do {
 				x1 = 2.0 * rand()/(float)RAND_MAX - 1.0;
 				x2 = 2.0 * rand()/(float)RAND_MAX - 1.0;
 				w = x1 * x1 + x2 * x2;
 			} while ( w >= 1.0 );
-
+		
 			w = sqrt( (-2.0 * log( w ) ) / w );
 			y1= x1 * w;
-
 			y1*= strength / sqrt(3.0);
+			if (pattern) {
+			    y1 /= 2;
+			    y1 += patt[j%4]*strength*0.35;
+			}
 			if     (y1<-128) y1=-128;
 			else if(y1> 127) y1= 127;
 			if (averaged) y1 /= 3.0;
 			noise[i]= (int)y1;
 		}
+		if (RAND_N(6) == 0) j--;
 	}
 	
 
@@ -382,6 +403,8 @@
 	if(pos && pos<max) fp->temporal=1;
 	pos= strchr(args, 'h');
 	if(pos && pos<max) fp->quality=1;
+	pos= strchr(args, 'p');
+	if(pos && pos<max) fp->pattern=1;
 	pos= strchr(args, 'a');
 	if(pos && pos<max) {
 	    fp->temporal=1;