Mercurial > mplayer.hg
annotate libmpcodecs/vf_denoise3d.c @ 28835:6f5824a39ada
Make pausing_keep_force the default for the set_mouse_pos and key_down_event -
different behaviour is unlikely to make sense but it is better to handle
this in input.c instead of adding special cases to mplayer.c and being
able to override the default behaviour at least should not hurt.
author | reimar |
---|---|
date | Sat, 07 Mar 2009 13:25:55 +0000 |
parents | df67d03dde3b |
children | 290420c32921 |
rev | line source |
---|---|
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
1 /* |
26727 | 2 * Copyright (C) 2003 Daniel Moreno <comac@comac.darktech.org> |
3 * | |
4 * This file is part of MPlayer. | |
5 * | |
6 * MPlayer is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * MPlayer is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License along | |
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
19 */ | |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
20 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
21 #include <stdio.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
22 #include <stdlib.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
23 #include <string.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
24 #include <inttypes.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
25 #include <math.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
26 |
17012 | 27 #include "config.h" |
28 #include "mp_msg.h" | |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
29 |
28594
df67d03dde3b
Convert HAVE_MALLOC_H into a 0/1 definition, fixes the warning:
diego
parents:
26727
diff
changeset
|
30 #if HAVE_MALLOC_H |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
31 #include <malloc.h> |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
32 #endif |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
33 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
34 #include "img_format.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
35 #include "mp_image.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
36 #include "vf.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
37 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
38 #define PARAM1_DEFAULT 4.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
39 #define PARAM2_DEFAULT 3.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
40 #define PARAM3_DEFAULT 6.0 |
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 //===========================================================================// |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
43 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
44 struct vf_priv_s { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
45 int Coefs[4][512]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
46 unsigned char *Line; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
47 mp_image_t *pmpi; |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
53 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
54 static int config(struct vf_instance_s* vf, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
55 int width, int height, int d_width, int d_height, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
56 unsigned int flags, unsigned int outfmt){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
57 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
58 if(vf->priv->Line) free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
59 vf->priv->Line = malloc(width); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
60 vf->priv->pmpi=NULL; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
61 // vf->default_caps &= !VFCAP_ACCEPT_STRIDE; |
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 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
|
64 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
65 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
66 |
9439 | 67 static void uninit(struct vf_instance_s* vf) |
9179
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 free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
70 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
71 |
9365 | 72 #define LowPass(Prev, Curr, Coef) (Curr + Coef[Prev - Curr]) |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
73 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
74 static void deNoise(unsigned char *Frame, // mpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
75 unsigned char *FramePrev, // pmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
76 unsigned char *FrameDest, // dmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
77 unsigned char *LineAnt, // vf->priv->Line (width bytes) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
78 int W, int H, int sStride, int pStride, int dStride, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
79 int *Horizontal, int *Vertical, int *Temporal) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
80 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
81 int X, Y; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
82 int sLineOffs = 0, pLineOffs = 0, dLineOffs = 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
83 unsigned char PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
84 |
16684 | 85 /* 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
|
86 LineAnt[0] = PixelAnt = Frame[0]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
87 FrameDest[0] = LowPass(FramePrev[0], LineAnt[0], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
88 |
16684 | 89 /* 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
|
90 * last frame */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
91 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
92 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
93 PixelAnt = LowPass(PixelAnt, Frame[X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
94 LineAnt[X] = PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
95 FrameDest[X] = LowPass(FramePrev[X], LineAnt[X], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
96 } |
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 for (Y = 1; Y < H; Y++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
99 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
100 sLineOffs += sStride, pLineOffs += pStride, dLineOffs += dStride; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
101 /* First pixel on each line doesn't have previous pixel */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
102 PixelAnt = Frame[sLineOffs]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
103 LineAnt[0] = LowPass(LineAnt[0], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
104 FrameDest[dLineOffs] = LowPass(FramePrev[pLineOffs], LineAnt[0], Temporal); |
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 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
107 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
108 /* The rest are normal */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
109 PixelAnt = LowPass(PixelAnt, Frame[sLineOffs+X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
110 LineAnt[X] = LowPass(LineAnt[X], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
111 FrameDest[dLineOffs+X] = LowPass(FramePrev[pLineOffs+X], LineAnt[X], Temporal); |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
116 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
117 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17367
diff
changeset
|
118 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
|
119 int cw= mpi->w >> mpi->chroma_x_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
120 int ch= mpi->h >> mpi->chroma_y_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
121 int W = mpi->w, H = mpi->h; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
122 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
123 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
|
124 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
|
125 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
126 mpi->w,mpi->h); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
127 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
128 if(!dmpi) return 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
129 if (!vf->priv->pmpi) vf->priv->pmpi=mpi; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
130 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
131 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
|
132 vf->priv->Line, W, H, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
133 mpi->stride[0], vf->priv->pmpi->stride[0], dmpi->stride[0], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
134 vf->priv->Coefs[0] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
135 vf->priv->Coefs[0] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
136 vf->priv->Coefs[1] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
137 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
|
138 vf->priv->Line, cw, ch, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
139 mpi->stride[1], vf->priv->pmpi->stride[1], dmpi->stride[1], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
140 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
141 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
142 vf->priv->Coefs[3] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
143 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
|
144 vf->priv->Line, cw, ch, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
145 mpi->stride[2], vf->priv->pmpi->stride[2], dmpi->stride[2], |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
146 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
147 vf->priv->Coefs[2] + 256, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
148 vf->priv->Coefs[3] + 256); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
149 |
9182 | 150 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
|
151 return vf_next_put_image(vf,dmpi, pts); |
9179
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 //===========================================================================// |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
155 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
156 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
|
157 switch(fmt) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
158 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
159 case IMGFMT_YV12: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
160 case IMGFMT_I420: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
161 case IMGFMT_IYUV: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
162 case IMGFMT_YVU9: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
163 case IMGFMT_444P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
164 case IMGFMT_422P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
165 case IMGFMT_411P: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
166 return vf_next_query_format(vf, fmt); |
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 return 0; |
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 |
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 #define ABS(A) ( (A) > 0 ? (A) : -(A) ) |
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 static void PrecalcCoefs(int *Ct, double Dist25) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
175 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
176 int i; |
9365 | 177 double Gamma, Simil, C; |
9179
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 Gamma = log(0.25) / log(1.0 - Dist25/255.0); |
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 for (i = -256; i <= 255; i++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
182 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
183 Simil = 1.0 - ABS(i) / 255.0; |
9365 | 184 // Ct[256+i] = lround(pow(Simil, Gamma) * (double)i); |
185 C = pow(Simil, Gamma) * (double)i; | |
186 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
|
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
190 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
191 static int open(vf_instance_t *vf, char* args){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
192 double LumSpac, LumTmp, ChromSpac, ChromTmp; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
193 double Param1, Param2, Param3; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
194 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
195 vf->config=config; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
196 vf->put_image=put_image; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
197 vf->query_format=query_format; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
198 vf->uninit=uninit; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
199 vf->priv=malloc(sizeof(struct vf_priv_s)); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
200 memset(vf->priv, 0, sizeof(struct vf_priv_s)); |
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 if (args) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
203 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
204 switch(sscanf(args, "%lf:%lf:%lf", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
205 &Param1, &Param2, &Param3 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
206 )) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
207 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
208 case 0: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
209 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
210 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
211 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
212 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
213 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
214 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
215 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
216 case 1: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
217 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
218 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
219 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
220 ChromSpac = PARAM2_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
221 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
222 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
223 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
224 case 2: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
225 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
226 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
227 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
228 ChromSpac = Param2; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
229 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
230 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
231 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
232 case 3: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
233 LumSpac = Param1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
234 LumTmp = Param3; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
235 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
236 ChromSpac = Param2; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
237 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
238 break; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
239 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
240 default: |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
241 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
242 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
243 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
244 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
245 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
246 } |
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 else |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
249 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
250 LumSpac = PARAM1_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
251 LumTmp = PARAM3_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
252 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
253 ChromSpac = PARAM2_DEFAULT; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
254 ChromTmp = LumTmp * ChromSpac / LumSpac; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
255 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
256 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
257 PrecalcCoefs(vf->priv->Coefs[0], LumSpac); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
258 PrecalcCoefs(vf->priv->Coefs[1], LumTmp); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
259 PrecalcCoefs(vf->priv->Coefs[2], ChromSpac); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
260 PrecalcCoefs(vf->priv->Coefs[3], ChromTmp); |
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 return 1; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
263 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
264 |
25221 | 265 const vf_info_t vf_info_denoise3d = { |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
266 "3D Denoiser (variable lowpass filter)", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
267 "denoise3d", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
268 "Daniel Moreno", |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
269 "", |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9439
diff
changeset
|
270 open, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9439
diff
changeset
|
271 NULL |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
272 }; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
273 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
274 //===========================================================================// |