annotate libmpcodecs/vf_noise.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents a124f3abc1ec
children 00fff9a3b735
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
1 /*
83032783f65d noise generating filter
michael
parents:
diff changeset
2 Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
83032783f65d noise generating filter
michael
parents:
diff changeset
3
83032783f65d noise generating filter
michael
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
83032783f65d noise generating filter
michael
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
83032783f65d noise generating filter
michael
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
83032783f65d noise generating filter
michael
parents:
diff changeset
7 (at your option) any later version.
83032783f65d noise generating filter
michael
parents:
diff changeset
8
83032783f65d noise generating filter
michael
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
83032783f65d noise generating filter
michael
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
83032783f65d noise generating filter
michael
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83032783f65d noise generating filter
michael
parents:
diff changeset
12 GNU General Public License for more details.
83032783f65d noise generating filter
michael
parents:
diff changeset
13
83032783f65d noise generating filter
michael
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
83032783f65d noise generating filter
michael
parents:
diff changeset
15 along with this program; if not, write to the Free Software
17367
401b440a6d76 Update licensing information: The FSF changed postal address.
diego
parents: 17012
diff changeset
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
17 */
83032783f65d noise generating filter
michael
parents:
diff changeset
18
83032783f65d noise generating filter
michael
parents:
diff changeset
19 #include <stdio.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
20 #include <stdlib.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
21 #include <string.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
22 #include <inttypes.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
23 #include <math.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
24
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
25 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
26 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
27 #include "cpudetect.h"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
28
83032783f65d noise generating filter
michael
parents:
diff changeset
29 #ifdef HAVE_MALLOC_H
83032783f65d noise generating filter
michael
parents:
diff changeset
30 #include <malloc.h>
83032783f65d noise generating filter
michael
parents:
diff changeset
31 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
32
83032783f65d noise generating filter
michael
parents:
diff changeset
33 #include "img_format.h"
83032783f65d noise generating filter
michael
parents:
diff changeset
34 #include "mp_image.h"
83032783f65d noise generating filter
michael
parents:
diff changeset
35 #include "vf.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 13720
diff changeset
36 #include "libvo/fastmemcpy.h"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
37
83032783f65d noise generating filter
michael
parents:
diff changeset
38 #define MAX_NOISE 4096
83032783f65d noise generating filter
michael
parents:
diff changeset
39 #define MAX_SHIFT 1024
83032783f65d noise generating filter
michael
parents:
diff changeset
40 #define MAX_RES (MAX_NOISE-MAX_SHIFT)
83032783f65d noise generating filter
michael
parents:
diff changeset
41
83032783f65d noise generating filter
michael
parents:
diff changeset
42 //===========================================================================//
83032783f65d noise generating filter
michael
parents:
diff changeset
43
83032783f65d noise generating filter
michael
parents:
diff changeset
44 static inline void lineNoise_C(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift);
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
45 static inline void lineNoiseAvg_C(uint8_t *dst, uint8_t *src, int len, int8_t **shift);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
46
83032783f65d noise generating filter
michael
parents:
diff changeset
47 static void (*lineNoise)(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift)= lineNoise_C;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
48 static void (*lineNoiseAvg)(uint8_t *dst, uint8_t *src, int len, int8_t **shift)= lineNoiseAvg_C;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
49
83032783f65d noise generating filter
michael
parents:
diff changeset
50 typedef struct FilterParam{
83032783f65d noise generating filter
michael
parents:
diff changeset
51 int strength;
83032783f65d noise generating filter
michael
parents:
diff changeset
52 int uniform;
83032783f65d noise generating filter
michael
parents:
diff changeset
53 int temporal;
6448
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
54 int quality;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
55 int averaged;
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
56 int pattern;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
57 int shiftptr;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
58 int8_t *noise;
6964
f35d05c32dd1 film/average noise cleanup
michael
parents: 6963
diff changeset
59 int8_t *prev_shift[MAX_RES][3];
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
60 }FilterParam;
83032783f65d noise generating filter
michael
parents:
diff changeset
61
83032783f65d noise generating filter
michael
parents:
diff changeset
62 struct vf_priv_s {
83032783f65d noise generating filter
michael
parents:
diff changeset
63 FilterParam lumaParam;
83032783f65d noise generating filter
michael
parents:
diff changeset
64 FilterParam chromaParam;
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
65 unsigned int outfmt;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
66 };
83032783f65d noise generating filter
michael
parents:
diff changeset
67
18030
ec68026bc1d0 move 12k from data to bss (reduce binary size by 12k)
rfelker
parents: 17906
diff changeset
68 static int nonTempRandShift_init;
ec68026bc1d0 move 12k from data to bss (reduce binary size by 12k)
rfelker
parents: 17906
diff changeset
69 static int nonTempRandShift[MAX_RES];
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
70
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
71 static int patt[4] = {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
72 -1,0,1,0
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
73 };
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
74
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
75 #define RAND_N(range) ((int) ((double)range*rand()/(RAND_MAX+1.0)))
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
76 static int8_t *initNoise(FilterParam *fp){
83032783f65d noise generating filter
michael
parents:
diff changeset
77 int strength= fp->strength;
83032783f65d noise generating filter
michael
parents:
diff changeset
78 int uniform= fp->uniform;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
79 int averaged= fp->averaged;
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
80 int pattern= fp->pattern;
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
81 int8_t *noise= memalign(16, MAX_NOISE*sizeof(int8_t));
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
82 int i, j;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
83
83032783f65d noise generating filter
michael
parents:
diff changeset
84 srand(123457);
83032783f65d noise generating filter
michael
parents:
diff changeset
85
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
86 for(i=0,j=0; i<MAX_NOISE; i++,j++)
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
87 {
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
88 if(uniform) {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
89 if (averaged) {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
90 if (pattern) {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
91 noise[i]= (RAND_N(strength) - strength/2)/6
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
92 +patt[j%4]*strength*0.25/3;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
93 } else {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
94 noise[i]= (RAND_N(strength) - strength/2)/3;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
95 }
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
96 } else {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
97 if (pattern) {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
98 noise[i]= (RAND_N(strength) - strength/2)/2
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
99 + patt[j%4]*strength*0.25;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
100 } else {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
101 noise[i]= RAND_N(strength) - strength/2;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
102 }
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
103 }
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
104 } else {
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
105 double x1, x2, w, y1;
83032783f65d noise generating filter
michael
parents:
diff changeset
106 do {
83032783f65d noise generating filter
michael
parents:
diff changeset
107 x1 = 2.0 * rand()/(float)RAND_MAX - 1.0;
83032783f65d noise generating filter
michael
parents:
diff changeset
108 x2 = 2.0 * rand()/(float)RAND_MAX - 1.0;
83032783f65d noise generating filter
michael
parents:
diff changeset
109 w = x1 * x1 + x2 * x2;
83032783f65d noise generating filter
michael
parents:
diff changeset
110 } while ( w >= 1.0 );
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
111
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
112 w = sqrt( (-2.0 * log( w ) ) / w );
83032783f65d noise generating filter
michael
parents:
diff changeset
113 y1= x1 * w;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
114 y1*= strength / sqrt(3.0);
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
115 if (pattern) {
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
116 y1 /= 2;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
117 y1 += patt[j%4]*strength*0.35;
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
118 }
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
119 if (y1<-128) y1=-128;
83032783f65d noise generating filter
michael
parents:
diff changeset
120 else if(y1> 127) y1= 127;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
121 if (averaged) y1 /= 3.0;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
122 noise[i]= (int)y1;
83032783f65d noise generating filter
michael
parents:
diff changeset
123 }
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
124 if (RAND_N(6) == 0) j--;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
125 }
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
126
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
127
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
128 for (i = 0; i < MAX_RES; i++)
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
129 for (j = 0; j < 3; j++)
6964
f35d05c32dd1 film/average noise cleanup
michael
parents: 6963
diff changeset
130 fp->prev_shift[i][j] = noise + (rand()&(MAX_SHIFT-1));
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
131
18030
ec68026bc1d0 move 12k from data to bss (reduce binary size by 12k)
rfelker
parents: 17906
diff changeset
132 if(!nonTempRandShift_init){
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
133 for(i=0; i<MAX_RES; i++){
83032783f65d noise generating filter
michael
parents:
diff changeset
134 nonTempRandShift[i]= rand()&(MAX_SHIFT-1);
83032783f65d noise generating filter
michael
parents:
diff changeset
135 }
18030
ec68026bc1d0 move 12k from data to bss (reduce binary size by 12k)
rfelker
parents: 17906
diff changeset
136 nonTempRandShift_init = 1;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
137 }
83032783f65d noise generating filter
michael
parents:
diff changeset
138
83032783f65d noise generating filter
michael
parents:
diff changeset
139 fp->noise= noise;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
140 fp->shiftptr= 0;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
141 return noise;
83032783f65d noise generating filter
michael
parents:
diff changeset
142 }
83032783f65d noise generating filter
michael
parents:
diff changeset
143
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
144 /***************************************************************************/
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
145
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
146 #ifdef HAVE_MMX
83032783f65d noise generating filter
michael
parents:
diff changeset
147 static inline void lineNoise_MMX(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
148 long mmx_len= len&(~7);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
149 noise+=shift;
83032783f65d noise generating filter
michael
parents:
diff changeset
150
83032783f65d noise generating filter
michael
parents:
diff changeset
151 asm volatile(
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
152 "mov %3, %%"REG_a" \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
153 "pcmpeqb %%mm7, %%mm7 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
154 "psllw $15, %%mm7 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
155 "packsswb %%mm7, %%mm7 \n\t"
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18684
diff changeset
156 ASMALIGN(4)
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
157 "1: \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
158 "movq (%0, %%"REG_a"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
159 "movq (%1, %%"REG_a"), %%mm1 \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
160 "pxor %%mm7, %%mm0 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
161 "paddsb %%mm1, %%mm0 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
162 "pxor %%mm7, %%mm0 \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
163 "movq %%mm0, (%2, %%"REG_a") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
164 "add $8, %%"REG_a" \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
165 " js 1b \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
166 :: "r" (src+mmx_len), "r" (noise+mmx_len), "r" (dst+mmx_len), "g" (-mmx_len)
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
167 : "%"REG_a
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
168 );
83032783f65d noise generating filter
michael
parents:
diff changeset
169 if(mmx_len!=len)
83032783f65d noise generating filter
michael
parents:
diff changeset
170 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0);
83032783f65d noise generating filter
michael
parents:
diff changeset
171 }
83032783f65d noise generating filter
michael
parents:
diff changeset
172 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
173
83032783f65d noise generating filter
michael
parents:
diff changeset
174 //duplicate of previous except movntq
83032783f65d noise generating filter
michael
parents:
diff changeset
175 #ifdef HAVE_MMX2
83032783f65d noise generating filter
michael
parents:
diff changeset
176 static inline void lineNoise_MMX2(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
177 long mmx_len= len&(~7);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
178 noise+=shift;
83032783f65d noise generating filter
michael
parents:
diff changeset
179
83032783f65d noise generating filter
michael
parents:
diff changeset
180 asm volatile(
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
181 "mov %3, %%"REG_a" \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
182 "pcmpeqb %%mm7, %%mm7 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
183 "psllw $15, %%mm7 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
184 "packsswb %%mm7, %%mm7 \n\t"
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18684
diff changeset
185 ASMALIGN(4)
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
186 "1: \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
187 "movq (%0, %%"REG_a"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
188 "movq (%1, %%"REG_a"), %%mm1 \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
189 "pxor %%mm7, %%mm0 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
190 "paddsb %%mm1, %%mm0 \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
191 "pxor %%mm7, %%mm0 \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
192 "movntq %%mm0, (%2, %%"REG_a") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
193 "add $8, %%"REG_a" \n\t"
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
194 " js 1b \n\t"
83032783f65d noise generating filter
michael
parents:
diff changeset
195 :: "r" (src+mmx_len), "r" (noise+mmx_len), "r" (dst+mmx_len), "g" (-mmx_len)
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
196 : "%"REG_a
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
197 );
83032783f65d noise generating filter
michael
parents:
diff changeset
198 if(mmx_len!=len)
83032783f65d noise generating filter
michael
parents:
diff changeset
199 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0);
83032783f65d noise generating filter
michael
parents:
diff changeset
200 }
83032783f65d noise generating filter
michael
parents:
diff changeset
201 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
202
83032783f65d noise generating filter
michael
parents:
diff changeset
203 static inline void lineNoise_C(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){
83032783f65d noise generating filter
michael
parents:
diff changeset
204 int i;
83032783f65d noise generating filter
michael
parents:
diff changeset
205 noise+= shift;
83032783f65d noise generating filter
michael
parents:
diff changeset
206 for(i=0; i<len; i++)
83032783f65d noise generating filter
michael
parents:
diff changeset
207 {
83032783f65d noise generating filter
michael
parents:
diff changeset
208 int v= src[i]+ noise[i];
83032783f65d noise generating filter
michael
parents:
diff changeset
209 if(v>255) dst[i]=255; //FIXME optimize
83032783f65d noise generating filter
michael
parents:
diff changeset
210 else if(v<0) dst[i]=0;
83032783f65d noise generating filter
michael
parents:
diff changeset
211 else dst[i]=v;
83032783f65d noise generating filter
michael
parents:
diff changeset
212 }
83032783f65d noise generating filter
michael
parents:
diff changeset
213 }
83032783f65d noise generating filter
michael
parents:
diff changeset
214
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
215 /***************************************************************************/
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
216
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
217 #ifdef HAVE_MMX
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
218 static inline void lineNoiseAvg_MMX(uint8_t *dst, uint8_t *src, int len, int8_t **shift){
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
219 long mmx_len= len&(~7);
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
220
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
221 asm volatile(
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
222 "mov %5, %%"REG_a" \n\t"
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18684
diff changeset
223 ASMALIGN(4)
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
224 "1: \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
225 "movq (%1, %%"REG_a"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
226 "movq (%0, %%"REG_a"), %%mm0 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
227 "paddb (%2, %%"REG_a"), %%mm1 \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
228 "paddb (%3, %%"REG_a"), %%mm1 \n\t"
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
229 "movq %%mm0, %%mm2 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
230 "movq %%mm1, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
231 "punpcklbw %%mm0, %%mm0 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
232 "punpckhbw %%mm2, %%mm2 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
233 "punpcklbw %%mm1, %%mm1 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
234 "punpckhbw %%mm3, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
235 "pmulhw %%mm0, %%mm1 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
236 "pmulhw %%mm2, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
237 "paddw %%mm1, %%mm1 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
238 "paddw %%mm3, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
239 "paddw %%mm0, %%mm1 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
240 "paddw %%mm2, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
241 "psrlw $8, %%mm1 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
242 "psrlw $8, %%mm3 \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
243 "packuswb %%mm3, %%mm1 \n\t"
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
244 "movq %%mm1, (%4, %%"REG_a") \n\t"
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
245 "add $8, %%"REG_a" \n\t"
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
246 " js 1b \n\t"
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
247 :: "r" (src+mmx_len), "r" (shift[0]+mmx_len), "r" (shift[1]+mmx_len), "r" (shift[2]+mmx_len),
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
248 "r" (dst+mmx_len), "g" (-mmx_len)
13720
821f464b4d90 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents: 10141
diff changeset
249 : "%"REG_a
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
250 );
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
251
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
252 if(mmx_len!=len){
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
253 int8_t *shift2[3]={shift[0]+mmx_len, shift[1]+mmx_len, shift[2]+mmx_len};
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
254 lineNoiseAvg_C(dst+mmx_len, src+mmx_len, len-mmx_len, shift2);
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
255 }
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
256 }
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
257 #endif
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
258
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
259 static inline void lineNoiseAvg_C(uint8_t *dst, uint8_t *src, int len, int8_t **shift){
6965
f8ea0af8edb0 optimization
michael
parents: 6964
diff changeset
260 int i;
f8ea0af8edb0 optimization
michael
parents: 6964
diff changeset
261 int8_t *src2= (int8_t*)src;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
262
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
263 for(i=0; i<len; i++)
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
264 {
6965
f8ea0af8edb0 optimization
michael
parents: 6964
diff changeset
265 const int n= shift[0][i] + shift[1][i] + shift[2][i];
f8ea0af8edb0 optimization
michael
parents: 6964
diff changeset
266 dst[i]= src2[i]+((n*src2[i])>>7);
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
267 }
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
268 }
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
269
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
270 /***************************************************************************/
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
271
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
272 static void noise(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int width, int height, FilterParam *fp){
83032783f65d noise generating filter
michael
parents:
diff changeset
273 int8_t *noise= fp->noise;
83032783f65d noise generating filter
michael
parents:
diff changeset
274 int y;
83032783f65d noise generating filter
michael
parents:
diff changeset
275 int shift=0;
83032783f65d noise generating filter
michael
parents:
diff changeset
276
83032783f65d noise generating filter
michael
parents:
diff changeset
277 if(!noise)
83032783f65d noise generating filter
michael
parents:
diff changeset
278 {
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
279 if(src==dst) return;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
280
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 19372
diff changeset
281 if(dstStride==srcStride) fast_memcpy(dst, src, srcStride*height);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
282 else
83032783f65d noise generating filter
michael
parents:
diff changeset
283 {
83032783f65d noise generating filter
michael
parents:
diff changeset
284 for(y=0; y<height; y++)
83032783f65d noise generating filter
michael
parents:
diff changeset
285 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 19372
diff changeset
286 fast_memcpy(dst, src, width);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
287 dst+= dstStride;
6448
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
288 src+= srcStride;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
289 }
83032783f65d noise generating filter
michael
parents:
diff changeset
290 }
83032783f65d noise generating filter
michael
parents:
diff changeset
291 return;
83032783f65d noise generating filter
michael
parents:
diff changeset
292 }
83032783f65d noise generating filter
michael
parents:
diff changeset
293
83032783f65d noise generating filter
michael
parents:
diff changeset
294 for(y=0; y<height; y++)
83032783f65d noise generating filter
michael
parents:
diff changeset
295 {
83032783f65d noise generating filter
michael
parents:
diff changeset
296 if(fp->temporal) shift= rand()&(MAX_SHIFT -1);
83032783f65d noise generating filter
michael
parents:
diff changeset
297 else shift= nonTempRandShift[y];
83032783f65d noise generating filter
michael
parents:
diff changeset
298
6448
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
299 if(fp->quality==0) shift&= ~7;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
300 if (fp->averaged) {
6964
f35d05c32dd1 film/average noise cleanup
michael
parents: 6963
diff changeset
301 lineNoiseAvg(dst, src, width, fp->prev_shift[y]);
f35d05c32dd1 film/average noise cleanup
michael
parents: 6963
diff changeset
302 fp->prev_shift[y][fp->shiftptr] = noise + shift;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
303 } else {
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
304 lineNoise(dst, src, noise, width, shift);
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
305 }
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
306 dst+= dstStride;
83032783f65d noise generating filter
michael
parents:
diff changeset
307 src+= srcStride;
83032783f65d noise generating filter
michael
parents:
diff changeset
308 }
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
309 fp->shiftptr++;
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
310 if (fp->shiftptr == 3) fp->shiftptr = 0;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
311 }
83032783f65d noise generating filter
michael
parents:
diff changeset
312
83032783f65d noise generating filter
michael
parents:
diff changeset
313 static int config(struct vf_instance_s* vf,
83032783f65d noise generating filter
michael
parents:
diff changeset
314 int width, int height, int d_width, int d_height,
83032783f65d noise generating filter
michael
parents:
diff changeset
315 unsigned int flags, unsigned int outfmt){
6448
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
316
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
317 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
83032783f65d noise generating filter
michael
parents:
diff changeset
318 }
83032783f65d noise generating filter
michael
parents:
diff changeset
319
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
320 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
321 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
6962
ba721168ed24 oops forgot to commit that
michael
parents: 6448
diff changeset
322 if(mpi->imgfmt!=vf->priv->outfmt) return; // colorspace differ
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
323 // ok, we can do pp in-place (or pp disabled):
10141
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
324 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
325 mpi->type, mpi->flags, mpi->w, mpi->h);
10141
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
326 mpi->planes[0]=vf->dmpi->planes[0];
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
327 mpi->stride[0]=vf->dmpi->stride[0];
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
328 mpi->width=vf->dmpi->width;
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
329 if(mpi->flags&MP_IMGFLAG_PLANAR){
10141
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
330 mpi->planes[1]=vf->dmpi->planes[1];
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
331 mpi->planes[2]=vf->dmpi->planes[2];
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
332 mpi->stride[1]=vf->dmpi->stride[1];
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
333 mpi->stride[2]=vf->dmpi->stride[2];
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
334 }
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
335 mpi->flags|=MP_IMGFLAG_DIRECT;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
336 }
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
337
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17367
diff changeset
338 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
339 mp_image_t *dmpi;
83032783f65d noise generating filter
michael
parents:
diff changeset
340
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
341 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
342 // no DR, so get a new image! hope we'll get DR buffer:
10141
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
343 vf->dmpi=vf_get_image(vf->next,vf->priv->outfmt,
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
344 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
345 mpi->w,mpi->h);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
346 //printf("nodr\n");
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
347 }
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
348 //else printf("dr\n");
10141
7d6a854a5fe5 cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents: 9934
diff changeset
349 dmpi= vf->dmpi;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
350
83032783f65d noise generating filter
michael
parents:
diff changeset
351 noise(dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, &vf->priv->lumaParam);
83032783f65d noise generating filter
michael
parents:
diff changeset
352 noise(dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w/2, mpi->h/2, &vf->priv->chromaParam);
83032783f65d noise generating filter
michael
parents:
diff changeset
353 noise(dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w/2, mpi->h/2, &vf->priv->chromaParam);
83032783f65d noise generating filter
michael
parents:
diff changeset
354
9934
89da8ec89558 vf_clone_mpi_attributes()
michael
parents: 9593
diff changeset
355 vf_clone_mpi_attributes(dmpi, mpi);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
356
83032783f65d noise generating filter
michael
parents:
diff changeset
357 #ifdef HAVE_MMX
83032783f65d noise generating filter
michael
parents:
diff changeset
358 if(gCpuCaps.hasMMX) asm volatile ("emms\n\t");
83032783f65d noise generating filter
michael
parents:
diff changeset
359 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
360 #ifdef HAVE_MMX2
83032783f65d noise generating filter
michael
parents:
diff changeset
361 if(gCpuCaps.hasMMX2) asm volatile ("sfence\n\t");
83032783f65d noise generating filter
michael
parents:
diff changeset
362 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
363
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17367
diff changeset
364 return vf_next_put_image(vf,dmpi, pts);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
365 }
83032783f65d noise generating filter
michael
parents:
diff changeset
366
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
367 static void uninit(struct vf_instance_s* vf){
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
368 if(!vf->priv) return;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
369
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
370 if(vf->priv->chromaParam.noise) free(vf->priv->chromaParam.noise);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
371 vf->priv->chromaParam.noise= NULL;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
372
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
373 if(vf->priv->lumaParam.noise) free(vf->priv->lumaParam.noise);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
374 vf->priv->lumaParam.noise= NULL;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
375
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
376 free(vf->priv);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
377 vf->priv=NULL;
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
378 }
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
379
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
380 //===========================================================================//
83032783f65d noise generating filter
michael
parents:
diff changeset
381
83032783f65d noise generating filter
michael
parents:
diff changeset
382 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
83032783f65d noise generating filter
michael
parents:
diff changeset
383 switch(fmt)
83032783f65d noise generating filter
michael
parents:
diff changeset
384 {
83032783f65d noise generating filter
michael
parents:
diff changeset
385 case IMGFMT_YV12:
83032783f65d noise generating filter
michael
parents:
diff changeset
386 case IMGFMT_I420:
83032783f65d noise generating filter
michael
parents:
diff changeset
387 case IMGFMT_IYUV:
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
388 return vf_next_query_format(vf,vf->priv->outfmt);
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
389 }
83032783f65d noise generating filter
michael
parents:
diff changeset
390 return 0;
83032783f65d noise generating filter
michael
parents:
diff changeset
391 }
83032783f65d noise generating filter
michael
parents:
diff changeset
392
83032783f65d noise generating filter
michael
parents:
diff changeset
393 static void parse(FilterParam *fp, char* args){
83032783f65d noise generating filter
michael
parents:
diff changeset
394 char *pos;
83032783f65d noise generating filter
michael
parents:
diff changeset
395 char *max= strchr(args, ':');
83032783f65d noise generating filter
michael
parents:
diff changeset
396
83032783f65d noise generating filter
michael
parents:
diff changeset
397 if(!max) max= args + strlen(args);
83032783f65d noise generating filter
michael
parents:
diff changeset
398
83032783f65d noise generating filter
michael
parents:
diff changeset
399 fp->strength= atoi(args);
83032783f65d noise generating filter
michael
parents:
diff changeset
400 pos= strchr(args, 'u');
83032783f65d noise generating filter
michael
parents:
diff changeset
401 if(pos && pos<max) fp->uniform=1;
83032783f65d noise generating filter
michael
parents:
diff changeset
402 pos= strchr(args, 't');
83032783f65d noise generating filter
michael
parents:
diff changeset
403 if(pos && pos<max) fp->temporal=1;
6448
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
404 pos= strchr(args, 'h');
e10e3264c19c higher quality mode
michael
parents: 6447
diff changeset
405 if(pos && pos<max) fp->quality=1;
6990
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
406 pos= strchr(args, 'p');
857bae3001e8 semi regular noise pattern patch by (Jindrich Makovicka <makovick at kmlinux dot fjfi dot cvut dot cz>)
michael
parents: 6966
diff changeset
407 if(pos && pos<max) fp->pattern=1;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
408 pos= strchr(args, 'a');
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
409 if(pos && pos<max) {
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
410 fp->temporal=1;
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
411 fp->averaged=1;
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
412 }
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
413
83032783f65d noise generating filter
michael
parents:
diff changeset
414 if(fp->strength) initNoise(fp);
83032783f65d noise generating filter
michael
parents:
diff changeset
415 }
83032783f65d noise generating filter
michael
parents:
diff changeset
416
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
417 static unsigned int fmt_list[]={
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
418 IMGFMT_YV12,
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
419 IMGFMT_I420,
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
420 IMGFMT_IYUV,
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
421 0
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
422 };
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
423
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
424 static int open(vf_instance_t *vf, char* args){
83032783f65d noise generating filter
michael
parents:
diff changeset
425 vf->config=config;
83032783f65d noise generating filter
michael
parents:
diff changeset
426 vf->put_image=put_image;
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
427 vf->get_image=get_image;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
428 vf->query_format=query_format;
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
429 vf->uninit=uninit;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
430 vf->priv=malloc(sizeof(struct vf_priv_s));
83032783f65d noise generating filter
michael
parents:
diff changeset
431 memset(vf->priv, 0, sizeof(struct vf_priv_s));
83032783f65d noise generating filter
michael
parents:
diff changeset
432 if(args)
83032783f65d noise generating filter
michael
parents:
diff changeset
433 {
83032783f65d noise generating filter
michael
parents:
diff changeset
434 char *arg2= strchr(args,':');
83032783f65d noise generating filter
michael
parents:
diff changeset
435 if(arg2) parse(&vf->priv->chromaParam, arg2+1);
83032783f65d noise generating filter
michael
parents:
diff changeset
436 parse(&vf->priv->lumaParam, args);
83032783f65d noise generating filter
michael
parents:
diff changeset
437 }
6447
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
438
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
439 // check csp:
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
440 vf->priv->outfmt=vf_match_csp(&vf->next,fmt_list,IMGFMT_YV12);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
441 if(!vf->priv->outfmt)
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
442 {
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
443 uninit(vf);
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
444 return 0; // no csp match :(
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
445 }
751a5775ac35 direct rendering (hopefully at least, TFM for the video filters is a bit nonexistent or iam just too stupid) ;)
michael
parents: 6424
diff changeset
446
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
447
83032783f65d noise generating filter
michael
parents:
diff changeset
448 #ifdef HAVE_MMX
6966
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
449 if(gCpuCaps.hasMMX){
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
450 lineNoise= lineNoise_MMX;
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
451 lineNoiseAvg= lineNoiseAvg_MMX;
2994bd73f35d mmx optimized avg/film noise
michael
parents: 6965
diff changeset
452 }
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
453 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
454 #ifdef HAVE_MMX2
83032783f65d noise generating filter
michael
parents:
diff changeset
455 if(gCpuCaps.hasMMX2) lineNoise= lineNoise_MMX2;
6963
76fee64d884a film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents: 6962
diff changeset
456 // if(gCpuCaps.hasMMX) lineNoiseAvg= lineNoiseAvg_MMX2;
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
457 #endif
83032783f65d noise generating filter
michael
parents:
diff changeset
458
83032783f65d noise generating filter
michael
parents:
diff changeset
459 return 1;
83032783f65d noise generating filter
michael
parents:
diff changeset
460 }
83032783f65d noise generating filter
michael
parents:
diff changeset
461
83032783f65d noise generating filter
michael
parents:
diff changeset
462 vf_info_t vf_info_noise = {
18684
c9de3673e299 typo noticed by Alexander Monakov monoid$$at$$fds-net$$dot$$ru
diego
parents: 18104
diff changeset
463 "noise generator",
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
464 "noise",
83032783f65d noise generating filter
michael
parents:
diff changeset
465 "Michael Niedermayer",
83032783f65d noise generating filter
michael
parents:
diff changeset
466 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 7368
diff changeset
467 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 7368
diff changeset
468 NULL
6424
83032783f65d noise generating filter
michael
parents:
diff changeset
469 };
83032783f65d noise generating filter
michael
parents:
diff changeset
470
83032783f65d noise generating filter
michael
parents:
diff changeset
471 //===========================================================================//