Mercurial > mplayer.hg
annotate libmpcodecs/vf_denoise3d.c @ 26625:5b89b42f6d50
Only compile and use libmpeg2 AltiVec code when AltiVec is available. The
AltiVec code needs -maltivec to compile, but then AltiVec instructions
appear in other places of the code causing MPlayer to sigill.
Somehow upstream libmpeg2 manages not to sigill under what appear to be
the same circumstances. Enlightenment welcome.
author | diego |
---|---|
date | Sat, 03 May 2008 15:23:22 +0000 |
parents | 00fff9a3b735 |
children | 82601a38e2a7 |
rev | line source |
---|---|
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
1 /* |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
2 Copyright (C) 2003 Daniel Moreno <comac@comac.darktech.org> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
3 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
4 This program is free software; you can redistribute it and/or modify |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
5 it under the terms of the GNU General Public License as published by |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
6 the Free Software Foundation; either version 2 of the License, or |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
7 (at your option) any later version. |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
8 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
9 This program is distributed in the hope that it will be useful, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
12 GNU General Public License for more details. |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
13 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
15 along with this program; if not, write to the Free Software |
17367
401b440a6d76
Update licensing information: The FSF changed postal address.
diego
parents:
17012
diff
changeset
|
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
17 */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
18 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
19 #include <stdio.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
20 #include <stdlib.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
21 #include <string.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
22 #include <inttypes.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
23 #include <math.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
24 |
17012 | 25 #include "config.h" |
26 #include "mp_msg.h" | |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
27 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
28 #ifdef HAVE_MALLOC_H |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
29 #include <malloc.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
30 #endif |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
31 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
32 #include "img_format.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
33 #include "mp_image.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
34 #include "vf.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
35 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
36 #define PARAM1_DEFAULT 4.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
37 #define PARAM2_DEFAULT 3.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
38 #define PARAM3_DEFAULT 6.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
39 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
40 //===========================================================================// |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
41 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
42 struct vf_priv_s { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
43 int Coefs[4][512]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
44 unsigned char *Line; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
45 mp_image_t *pmpi; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
46 }; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
47 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
48 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
49 /***************************************************************************/ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
50 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
51 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
52 static int config(struct vf_instance_s* vf, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
53 int width, int height, int d_width, int d_height, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
54 unsigned int flags, unsigned int outfmt){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
55 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
56 if(vf->priv->Line) free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
57 vf->priv->Line = malloc(width); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
58 vf->priv->pmpi=NULL; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
59 // vf->default_caps &= !VFCAP_ACCEPT_STRIDE; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
60 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
61 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
62 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
63 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
64 |
9439 | 65 static void uninit(struct vf_instance_s* vf) |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
66 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
67 free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
68 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
69 |
9365 | 70 #define LowPass(Prev, Curr, Coef) (Curr + Coef[Prev - Curr]) |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
71 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
72 static void deNoise(unsigned char *Frame, // mpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
73 unsigned char *FramePrev, // pmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
74 unsigned char *FrameDest, // dmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
75 unsigned char *LineAnt, // vf->priv->Line (width bytes) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
76 int W, int H, int sStride, int pStride, int dStride, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
77 int *Horizontal, int *Vertical, int *Temporal) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
78 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
79 int X, Y; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
80 int sLineOffs = 0, pLineOffs = 0, dLineOffs = 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
81 unsigned char PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
82 |
16684 | 83 /* First pixel has no left nor top neighbor. Only previous frame */ |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
84 LineAnt[0] = PixelAnt = Frame[0]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
85 FrameDest[0] = LowPass(FramePrev[0], LineAnt[0], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
86 |
16684 | 87 /* Fist line has no top neighbor. Only left one for each pixel and |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
88 * last frame */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
89 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
90 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
91 PixelAnt = LowPass(PixelAnt, Frame[X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
92 LineAnt[X] = PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
93 FrameDest[X] = LowPass(FramePrev[X], LineAnt[X], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
94 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
95 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
96 for (Y = 1; Y < H; Y++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
97 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
98 sLineOffs += sStride, pLineOffs += pStride, dLineOffs += dStride; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
99 /* First pixel on each line doesn't have previous pixel */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
100 PixelAnt = Frame[sLineOffs]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
101 LineAnt[0] = LowPass(LineAnt[0], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
102 FrameDest[dLineOffs] = LowPass(FramePrev[pLineOffs], LineAnt[0], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
103 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
104 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
105 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
106 /* The rest are normal */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
107 PixelAnt = LowPass(PixelAnt, Frame[sLineOffs+X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
108 LineAnt[X] = LowPass(LineAnt[X], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
109 FrameDest[dLineOffs+X] = LowPass(FramePrev[pLineOffs+X], LineAnt[X], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
110 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
111 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
112 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
113 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
114 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
115 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17367
diff
changeset
|
116 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
117 int cw= mpi->w >> mpi->chroma_x_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
118 int ch= mpi->h >> mpi->chroma_y_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
119 int W = mpi->w, H = mpi->h; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
120 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
121 mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, |
16156
64606c87ead9
Needs the previous mpi (pmpi), so request a readable one and request
reimar
parents:
9593
diff
changeset
|
122 MP_IMGTYPE_IP, MP_IMGFLAG_ACCEPT_STRIDE | |
64606c87ead9
Needs the previous mpi (pmpi), so request a readable one and request
reimar
parents:
9593
diff
changeset
|
123 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
124 mpi->w,mpi->h); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
125 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
126 if(!dmpi) return 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
127 if (!vf->priv->pmpi) vf->priv->pmpi=mpi; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
128 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
129 deNoise(mpi->planes[0], vf->priv->pmpi->planes[0], dmpi->planes[0], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
130 vf->priv->Line, W, H, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
131 mpi->stride[0], vf->priv->pmpi->stride[0], dmpi->stride[0], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
132 vf->priv->Coefs[0] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
133 vf->priv->Coefs[0] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
134 vf->priv->Coefs[1] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
135 deNoise(mpi->planes[1], vf->priv->pmpi->planes[1], dmpi->planes[1], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
136 vf->priv->Line, cw, ch, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
137 mpi->stride[1], vf->priv->pmpi->stride[1], dmpi->stride[1], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
138 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
139 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
140 vf->priv->Coefs[3] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
141 deNoise(mpi->planes[2], vf->priv->pmpi->planes[2], dmpi->planes[2], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
142 vf->priv->Line, cw, ch, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
143 mpi->stride[2], vf->priv->pmpi->stride[2], dmpi->stride[2], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
144 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
145 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
146 vf->priv->Coefs[3] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
147 |
9182 | 148 vf->priv->pmpi=dmpi; // save reference image |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17367
diff
changeset
|
149 return vf_next_put_image(vf,dmpi, pts); |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
150 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
151 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
152 //===========================================================================// |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
153 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
154 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
155 switch(fmt) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
156 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
157 case IMGFMT_YV12: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
158 case IMGFMT_I420: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
159 case IMGFMT_IYUV: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
160 case IMGFMT_YVU9: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
161 case IMGFMT_444P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
162 case IMGFMT_422P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
163 case IMGFMT_411P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
164 return vf_next_query_format(vf, fmt); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
165 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
166 return 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
167 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
168 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
169 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
170 #define ABS(A) ( (A) > 0 ? (A) : -(A) ) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
171 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
172 static void PrecalcCoefs(int *Ct, double Dist25) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
173 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
174 int i; |
9365 | 175 double Gamma, Simil, C; |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
176 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
177 Gamma = log(0.25) / log(1.0 - Dist25/255.0); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
178 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
179 for (i = -256; i <= 255; i++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
180 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
181 Simil = 1.0 - ABS(i) / 255.0; |
9365 | 182 // Ct[256+i] = lround(pow(Simil, Gamma) * (double)i); |
183 C = pow(Simil, Gamma) * (double)i; | |
184 Ct[256+i] = (C<0) ? (C-0.5) : (C+0.5); | |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
185 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
186 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
187 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
188 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
189 static int open(vf_instance_t *vf, char* args){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
190 double LumSpac, LumTmp, ChromSpac, ChromTmp; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
191 double Param1, Param2, Param3; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
192 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
193 vf->config=config; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
194 vf->put_image=put_image; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
195 vf->query_format=query_format; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
196 vf->uninit=uninit; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
197 vf->priv=malloc(sizeof(struct vf_priv_s)); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
198 memset(vf->priv, 0, sizeof(struct vf_priv_s)); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
199 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
200 if (args) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
201 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
202 switch(sscanf(args, "%lf:%lf:%lf", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
203 &Param1, &Param2, &Param3 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
204 )) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
205 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
206 case 0: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
207 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
208 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
209 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
210 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
211 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
212 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
213 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
214 case 1: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
215 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
216 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
217 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
218 ChromSpac = PARAM2_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
219 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
220 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
221 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
222 case 2: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
223 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
224 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
225 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
226 ChromSpac = Param2; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
227 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
228 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
229 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
230 case 3: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
231 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
232 LumTmp = Param3; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
233 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
234 ChromSpac = Param2; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
235 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
236 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
237 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
238 default: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
239 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
240 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
241 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
242 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
243 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
244 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
245 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
246 else |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
247 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
248 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
249 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
250 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
251 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
252 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
253 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
254 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
255 PrecalcCoefs(vf->priv->Coefs[0], LumSpac); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
256 PrecalcCoefs(vf->priv->Coefs[1], LumTmp); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
257 PrecalcCoefs(vf->priv->Coefs[2], ChromSpac); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
258 PrecalcCoefs(vf->priv->Coefs[3], ChromTmp); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
259 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
260 return 1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
261 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
262 |
25221 | 263 const vf_info_t vf_info_denoise3d = { |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
264 "3D Denoiser (variable lowpass filter)", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
265 "denoise3d", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
266 "Daniel Moreno", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
267 "", |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9439
diff
changeset
|
268 open, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9439
diff
changeset
|
269 NULL |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
270 }; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
271 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
272 //===========================================================================// |