# HG changeset patch # User michael # Date 1029059210 0 # Node ID 76fee64d884a99bb87d939e10db7144201e7bdc2 # Parent ba721168ed242d5e813cb6b496059a27b656b1cb film/average noise patch by (Jindrich Makovicka ) diff -r ba721168ed24 -r 76fee64d884a DOCS/tech/vop.txt --- a/DOCS/tech/vop.txt Sun Aug 11 09:40:57 2002 +0000 +++ b/DOCS/tech/vop.txt Sun Aug 11 09:46:50 2002 +0000 @@ -154,11 +154,12 @@ generate various test patterns MPI: TEMP, accepts stride --vop noise[=lumaNoise[u][t][h]:chromaNoise[u][t][h] +-vop noise[=lumaNoise[u][t|a][h]:chromaNoise[u][t|a][h] add noise 0<= lumaNoise, chromaNoise <=100 u uniform noise (gaussian otherwise) t temporal noise (noise pattern changes between frames) + a averaged temporal (smoother, but a lot slower) h high quality (slightly better looking, slightly slower) MPI: DR (if possible) or TEMP, accepts stride diff -r ba721168ed24 -r 76fee64d884a libmpcodecs/vf_noise.c --- a/libmpcodecs/vf_noise.c Sun Aug 11 09:40:57 2002 +0000 +++ b/libmpcodecs/vf_noise.c Sun Aug 11 09:46:50 2002 +0000 @@ -42,14 +42,19 @@ //===========================================================================// static inline void lineNoise_C(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift); +static inline void lineNoiseAvg_C(uint8_t *dst, uint8_t *src, int len, int8_t **shift); +static inline void lineNoiseAvg_CX(uint8_t *dst, uint8_t *src, int len, int8_t **shift, int add); static void (*lineNoise)(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift)= lineNoise_C; +static void (*lineNoiseAvg)(uint8_t *dst, uint8_t *src, int len, int8_t **shift)= lineNoiseAvg_C; typedef struct FilterParam{ int strength; int uniform; int temporal; int quality; + int averaged; + int shiftptr; int8_t *noise; }FilterParam; @@ -61,21 +66,26 @@ }; static int nonTempRandShift[MAX_RES]= {-1}; +static int8_t *prev_shift[MAX_RES][3]; static int8_t *initNoise(FilterParam *fp){ int strength= fp->strength; int uniform= fp->uniform; + int averaged= fp->averaged; int8_t *noise= memalign(16, MAX_NOISE*sizeof(int8_t)); - int i; + int i, j; srand(123457); for(i=0; i 127) y1= 127; + if (averaged) y1 /= 3.0; noise[i]= (int)y1; } } + + + for (i = 0; i < MAX_RES; i++) + for (j = 0; j < 3; j++) + prev_shift[i][j] = noise + (rand()&(MAX_SHIFT-1)); if(nonTempRandShift[0]==-1){ for(i=0; inoise= noise; + fp->shiftptr= 0; return noise; } +/***************************************************************************/ + #ifdef HAVE_MMX static inline void lineNoise_MMX(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ int mmx_len= len&(~7); @@ -172,6 +191,21 @@ } } +/***************************************************************************/ + +static inline void lineNoiseAvg_C(uint8_t *dst, uint8_t *src, int len, int8_t **shift){ + int i, j, n, v; + + for(i=0; inoise; int y; @@ -200,10 +234,17 @@ else shift= nonTempRandShift[y]; if(fp->quality==0) shift&= ~7; - lineNoise(dst, src, noise, width, shift); + if (fp->averaged) { + lineNoiseAvg(dst, src, width, prev_shift[y]); + prev_shift[y][fp->shiftptr] = noise + shift; + } else { + lineNoise(dst, src, noise, width, shift); + } dst+= dstStride; src+= srcStride; } + fp->shiftptr++; + if (fp->shiftptr == 3) fp->shiftptr = 0; } static int config(struct vf_instance_s* vf, @@ -300,6 +341,11 @@ if(pos && postemporal=1; pos= strchr(args, 'h'); if(pos && posquality=1; + pos= strchr(args, 'a'); + if(pos && postemporal=1; + fp->averaged=1; + } if(fp->strength) initNoise(fp); } @@ -337,9 +383,11 @@ #ifdef HAVE_MMX if(gCpuCaps.hasMMX) lineNoise= lineNoise_MMX; +// if(gCpuCaps.hasMMX) lineNoiseAvg= lineNoiseAvg_MMX; #endif #ifdef HAVE_MMX2 if(gCpuCaps.hasMMX2) lineNoise= lineNoise_MMX2; +// if(gCpuCaps.hasMMX) lineNoiseAvg= lineNoiseAvg_MMX2; #endif return 1;