Mercurial > mplayer.hg
annotate libmpcodecs/vf_noise.c @ 9046:13b7ad16f278
This patch should fix the display problem with 4bpp and 8bpp modes.
The problem was that the new drawing method assumes a linear
framebuffer, which is not available in those modes. This can be worked
around by using the old drawing method, which is what this patch does.
The old method can be forced, by using the "old" driver option.
This patch also enables linear addressing, since it improves write speed
to video memory considerably. The mentioned problem:
"it is not compatable with vga_draw* for some cards"
Is a bug in svgalib, which I think should be fixed in recent svgalib
versions. If someone sees this problem, please report to svgalib
maintainer (that's me).
patch by Matan Ziv-Av. matan@svgalib.org
author | arpi |
---|---|
date | Mon, 20 Jan 2003 21:33:11 +0000 |
parents | a894e99c1e51 |
children | e9a2af584986 |
rev | line source |
---|---|
6424 | 1 /* |
2 Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> | |
3 | |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2 of the License, or | |
7 (at your option) any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 */ | |
18 | |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <inttypes.h> | |
23 #include <math.h> | |
24 | |
25 #include "../config.h" | |
26 #include "../mp_msg.h" | |
27 #include "../cpudetect.h" | |
28 | |
29 #ifdef HAVE_MALLOC_H | |
30 #include <malloc.h> | |
31 #endif | |
32 | |
33 #include "img_format.h" | |
34 #include "mp_image.h" | |
35 #include "vf.h" | |
36 #include "../libvo/fastmemcpy.h" | |
37 | |
38 #define MAX_NOISE 4096 | |
39 #define MAX_SHIFT 1024 | |
40 #define MAX_RES (MAX_NOISE-MAX_SHIFT) | |
41 | |
42 //===========================================================================// | |
43 | |
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 | 46 |
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 | 49 |
50 typedef struct FilterParam{ | |
51 int strength; | |
52 int uniform; | |
53 int temporal; | |
6448 | 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 | 58 int8_t *noise; |
6964 | 59 int8_t *prev_shift[MAX_RES][3]; |
6424 | 60 }FilterParam; |
61 | |
62 struct vf_priv_s { | |
63 FilterParam lumaParam; | |
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 mp_image_t *dmpi; |
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
|
66 unsigned int outfmt; |
6424 | 67 }; |
68 | |
69 static int nonTempRandShift[MAX_RES]= {-1}; | |
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 | 76 static int8_t *initNoise(FilterParam *fp){ |
77 int strength= fp->strength; | |
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 | 83 |
84 srand(123457); | |
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 | 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 | 105 double x1, x2, w, y1; |
106 do { | |
107 x1 = 2.0 * rand()/(float)RAND_MAX - 1.0; | |
108 x2 = 2.0 * rand()/(float)RAND_MAX - 1.0; | |
109 w = x1 * x1 + x2 * x2; | |
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 | 112 w = sqrt( (-2.0 * log( w ) ) / w ); |
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 | 119 if (y1<-128) y1=-128; |
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 | 122 noise[i]= (int)y1; |
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 | 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 | 130 fp->prev_shift[i][j] = noise + (rand()&(MAX_SHIFT-1)); |
6424 | 131 |
132 if(nonTempRandShift[0]==-1){ | |
133 for(i=0; i<MAX_RES; i++){ | |
134 nonTempRandShift[i]= rand()&(MAX_SHIFT-1); | |
135 } | |
136 } | |
137 | |
138 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
|
139 fp->shiftptr= 0; |
6424 | 140 return noise; |
141 } | |
142 | |
6963
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
143 /***************************************************************************/ |
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
144 |
6424 | 145 #ifdef HAVE_MMX |
146 static inline void lineNoise_MMX(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ | |
147 int mmx_len= len&(~7); | |
148 noise+=shift; | |
149 | |
150 asm volatile( | |
151 "movl %3, %%eax \n\t" | |
152 "pcmpeqb %%mm7, %%mm7 \n\t" | |
153 "psllw $15, %%mm7 \n\t" | |
154 "packsswb %%mm7, %%mm7 \n\t" | |
155 ".balign 16 \n\t" | |
156 "1: \n\t" | |
157 "movq (%0, %%eax), %%mm0 \n\t" | |
158 "movq (%1, %%eax), %%mm1 \n\t" | |
159 "pxor %%mm7, %%mm0 \n\t" | |
160 "paddsb %%mm1, %%mm0 \n\t" | |
161 "pxor %%mm7, %%mm0 \n\t" | |
162 "movq %%mm0, (%2, %%eax) \n\t" | |
163 "addl $8, %%eax \n\t" | |
164 " js 1b \n\t" | |
165 :: "r" (src+mmx_len), "r" (noise+mmx_len), "r" (dst+mmx_len), "g" (-mmx_len) | |
166 : "%eax" | |
167 ); | |
168 if(mmx_len!=len) | |
169 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0); | |
170 } | |
171 #endif | |
172 | |
173 //duplicate of previous except movntq | |
174 #ifdef HAVE_MMX2 | |
175 static inline void lineNoise_MMX2(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ | |
176 int mmx_len= len&(~7); | |
177 noise+=shift; | |
178 | |
179 asm volatile( | |
180 "movl %3, %%eax \n\t" | |
181 "pcmpeqb %%mm7, %%mm7 \n\t" | |
182 "psllw $15, %%mm7 \n\t" | |
183 "packsswb %%mm7, %%mm7 \n\t" | |
184 ".balign 16 \n\t" | |
185 "1: \n\t" | |
186 "movq (%0, %%eax), %%mm0 \n\t" | |
187 "movq (%1, %%eax), %%mm1 \n\t" | |
188 "pxor %%mm7, %%mm0 \n\t" | |
189 "paddsb %%mm1, %%mm0 \n\t" | |
190 "pxor %%mm7, %%mm0 \n\t" | |
191 "movntq %%mm0, (%2, %%eax) \n\t" | |
192 "addl $8, %%eax \n\t" | |
193 " js 1b \n\t" | |
194 :: "r" (src+mmx_len), "r" (noise+mmx_len), "r" (dst+mmx_len), "g" (-mmx_len) | |
195 : "%eax" | |
196 ); | |
197 if(mmx_len!=len) | |
198 lineNoise_C(dst+mmx_len, src+mmx_len, noise+mmx_len, len-mmx_len, 0); | |
199 } | |
200 #endif | |
201 | |
202 static inline void lineNoise_C(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ | |
203 int i; | |
204 noise+= shift; | |
205 for(i=0; i<len; i++) | |
206 { | |
207 int v= src[i]+ noise[i]; | |
208 if(v>255) dst[i]=255; //FIXME optimize | |
209 else if(v<0) dst[i]=0; | |
210 else dst[i]=v; | |
211 } | |
212 } | |
213 | |
6963
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
214 /***************************************************************************/ |
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
215 |
6966 | 216 #ifdef HAVE_MMX |
217 static inline void lineNoiseAvg_MMX(uint8_t *dst, uint8_t *src, int len, int8_t **shift){ | |
218 int mmx_len= len&(~7); | |
219 | |
220 asm volatile( | |
221 "movl %5, %%eax \n\t" | |
222 ".balign 16 \n\t" | |
223 "1: \n\t" | |
224 "movq (%1, %%eax), %%mm1 \n\t" | |
225 "movq (%0, %%eax), %%mm0 \n\t" | |
226 "paddb (%2, %%eax), %%mm1 \n\t" | |
227 "paddb (%3, %%eax), %%mm1 \n\t" | |
228 "movq %%mm0, %%mm2 \n\t" | |
229 "movq %%mm1, %%mm3 \n\t" | |
230 "punpcklbw %%mm0, %%mm0 \n\t" | |
231 "punpckhbw %%mm2, %%mm2 \n\t" | |
232 "punpcklbw %%mm1, %%mm1 \n\t" | |
233 "punpckhbw %%mm3, %%mm3 \n\t" | |
234 "pmulhw %%mm0, %%mm1 \n\t" | |
235 "pmulhw %%mm2, %%mm3 \n\t" | |
236 "paddw %%mm1, %%mm1 \n\t" | |
237 "paddw %%mm3, %%mm3 \n\t" | |
238 "paddw %%mm0, %%mm1 \n\t" | |
239 "paddw %%mm2, %%mm3 \n\t" | |
240 "psrlw $8, %%mm1 \n\t" | |
241 "psrlw $8, %%mm3 \n\t" | |
242 "packuswb %%mm3, %%mm1 \n\t" | |
243 "movq %%mm1, (%4, %%eax) \n\t" | |
244 "addl $8, %%eax \n\t" | |
245 " js 1b \n\t" | |
246 :: "r" (src+mmx_len), "r" (shift[0]+mmx_len), "r" (shift[1]+mmx_len), "r" (shift[2]+mmx_len), | |
247 "r" (dst+mmx_len), "g" (-mmx_len) | |
248 : "%eax" | |
249 ); | |
250 | |
251 if(mmx_len!=len){ | |
252 int8_t *shift2[3]={shift[0]+mmx_len, shift[1]+mmx_len, shift[2]+mmx_len}; | |
253 lineNoiseAvg_C(dst+mmx_len, src+mmx_len, len-mmx_len, shift2); | |
254 } | |
255 } | |
256 #endif | |
257 | |
6963
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
258 static inline void lineNoiseAvg_C(uint8_t *dst, uint8_t *src, int len, int8_t **shift){ |
6965 | 259 int i; |
260 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
|
261 |
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
262 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
|
263 { |
6965 | 264 const int n= shift[0][i] + shift[1][i] + shift[2][i]; |
265 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
|
266 } |
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 |
6424 | 271 static void noise(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int width, int height, FilterParam *fp){ |
272 int8_t *noise= fp->noise; | |
273 int y; | |
274 int shift=0; | |
275 | |
276 if(!noise) | |
277 { | |
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
|
278 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
|
279 |
6424 | 280 if(dstStride==srcStride) memcpy(dst, src, srcStride*height); |
281 else | |
282 { | |
283 for(y=0; y<height; y++) | |
284 { | |
285 memcpy(dst, src, width); | |
286 dst+= dstStride; | |
6448 | 287 src+= srcStride; |
6424 | 288 } |
289 } | |
290 return; | |
291 } | |
292 | |
293 for(y=0; y<height; y++) | |
294 { | |
295 if(fp->temporal) shift= rand()&(MAX_SHIFT -1); | |
296 else shift= nonTempRandShift[y]; | |
297 | |
6448 | 298 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
|
299 if (fp->averaged) { |
6964 | 300 lineNoiseAvg(dst, src, width, fp->prev_shift[y]); |
301 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
|
302 } else { |
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
303 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
|
304 } |
6424 | 305 dst+= dstStride; |
306 src+= srcStride; | |
307 } | |
6963
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
308 fp->shiftptr++; |
76fee64d884a
film/average noise patch by (Jindrich Makovicka <makovick at KMLinux dot fjfi dot cvut dot cz>)
michael
parents:
6962
diff
changeset
|
309 if (fp->shiftptr == 3) fp->shiftptr = 0; |
6424 | 310 } |
311 | |
312 static int config(struct vf_instance_s* vf, | |
313 int width, int height, int d_width, int d_height, | |
314 unsigned int flags, unsigned int outfmt){ | |
6448 | 315 |
6424 | 316 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); |
317 } | |
318 | |
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
|
319 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
|
320 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change |
6962 | 321 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
|
322 // ok, we can do pp in-place (or pp disabled): |
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 vf->priv->dmpi=vf_get_image(vf->next,mpi->imgfmt, |
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
|
324 mpi->type, mpi->flags, 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
|
325 mpi->planes[0]=vf->priv->dmpi->planes[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
|
326 mpi->stride[0]=vf->priv->dmpi->stride[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
|
327 mpi->width=vf->priv->dmpi->width; |
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
|
328 if(mpi->flags&MP_IMGFLAG_PLANAR){ |
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 mpi->planes[1]=vf->priv->dmpi->planes[1]; |
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
|
330 mpi->planes[2]=vf->priv->dmpi->planes[2]; |
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
|
331 mpi->stride[1]=vf->priv->dmpi->stride[1]; |
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
|
332 mpi->stride[2]=vf->priv->dmpi->stride[2]; |
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
|
333 } |
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 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
|
335 } |
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 |
7368 | 337 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ |
6424 | 338 mp_image_t *dmpi; |
339 | |
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
|
340 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
|
341 // no DR, so get a new image! hope we'll get DR buffer: |
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 vf->priv->dmpi=vf_get_image(vf->next,vf->priv->outfmt, |
6424 | 343 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
|
344 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
|
345 //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
|
346 } |
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 //else printf("dr\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
|
348 dmpi= vf->priv->dmpi; |
6424 | 349 |
350 noise(dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, &vf->priv->lumaParam); | |
351 noise(dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w/2, mpi->h/2, &vf->priv->chromaParam); | |
352 noise(dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w/2, mpi->h/2, &vf->priv->chromaParam); | |
353 | |
354 dmpi->qscale=mpi->qscale; | |
355 dmpi->qstride=mpi->qstride; | |
356 | |
357 #ifdef HAVE_MMX | |
358 if(gCpuCaps.hasMMX) asm volatile ("emms\n\t"); | |
359 #endif | |
360 #ifdef HAVE_MMX2 | |
361 if(gCpuCaps.hasMMX2) asm volatile ("sfence\n\t"); | |
362 #endif | |
363 | |
7368 | 364 return vf_next_put_image(vf,dmpi); |
6424 | 365 } |
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 | 380 //===========================================================================// |
381 | |
382 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
383 switch(fmt) | |
384 { | |
385 case IMGFMT_YV12: | |
386 case IMGFMT_I420: | |
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 | 389 } |
390 return 0; | |
391 } | |
392 | |
393 static void parse(FilterParam *fp, char* args){ | |
394 char *pos; | |
395 char *max= strchr(args, ':'); | |
396 | |
397 if(!max) max= args + strlen(args); | |
398 | |
399 fp->strength= atoi(args); | |
400 pos= strchr(args, 'u'); | |
401 if(pos && pos<max) fp->uniform=1; | |
402 pos= strchr(args, 't'); | |
403 if(pos && pos<max) fp->temporal=1; | |
6448 | 404 pos= strchr(args, 'h'); |
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 | 413 |
414 if(fp->strength) initNoise(fp); | |
415 } | |
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 | 424 static int open(vf_instance_t *vf, char* args){ |
425 vf->config=config; | |
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 | 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 | 430 vf->priv=malloc(sizeof(struct vf_priv_s)); |
431 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
432 if(args) | |
433 { | |
434 char *arg2= strchr(args,':'); | |
435 if(arg2) parse(&vf->priv->chromaParam, arg2+1); | |
436 parse(&vf->priv->lumaParam, args); | |
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 | 447 |
448 #ifdef HAVE_MMX | |
6966 | 449 if(gCpuCaps.hasMMX){ |
450 lineNoise= lineNoise_MMX; | |
451 lineNoiseAvg= lineNoiseAvg_MMX; | |
452 } | |
6424 | 453 #endif |
454 #ifdef HAVE_MMX2 | |
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 | 457 #endif |
458 | |
459 return 1; | |
460 } | |
461 | |
462 vf_info_t vf_info_noise = { | |
463 "noise genenerator", | |
464 "noise", | |
465 "Michael Niedermayer", | |
466 "", | |
467 open | |
468 }; | |
469 | |
470 //===========================================================================// |