annotate libmpcodecs/vf_noise.c @ 32282:606e4157cd4c

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