summaryrefslogtreecommitdiffstats
path: root/libmpcodecs/vf_noise.c
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-13 17:53:32 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-13 17:53:32 +0000
commitca6c71ac5b34a6be212add80a867c8250712dc80 (patch)
tree118e42c8ec35ee50878672de584b6cf49d80fee4 /libmpcodecs/vf_noise.c
parent408cf7a6bbe0cedcfb691e223621426a3feeafd0 (diff)
downloadmpv-ca6c71ac5b34a6be212add80a867c8250712dc80.tar.bz2
mpv-ca6c71ac5b34a6be212add80a867c8250712dc80.tar.xz
semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6991 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs/vf_noise.c')
-rw-r--r--libmpcodecs/vf_noise.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/libmpcodecs/vf_noise.c b/libmpcodecs/vf_noise.c
index 6d36a0ac46..fb1cc90eeb 100644
--- a/libmpcodecs/vf_noise.c
+++ b/libmpcodecs/vf_noise.c
@@ -53,6 +53,7 @@ typedef struct FilterParam{
int temporal;
int quality;
int averaged;
+ int pattern;
int shiftptr;
int8_t *noise;
int8_t *prev_shift[MAX_RES][3];
@@ -67,40 +68,60 @@ struct vf_priv_s {
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 @@ static void parse(FilterParam *fp, char* args){
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;