Mercurial > mplayer.hg
annotate libmpcodecs/vf_denoise3d.c @ 9593:e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
Syntax is we decided, so you can give the nomes or not with both
vop and vf. vf take precedence over vop.
author | albeu |
---|---|
date | Sat, 15 Mar 2003 18:01:02 +0000 |
parents | b906ae5d346e |
children | 64606c87ead9 |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
25 #include "../config.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
26 #include "../mp_msg.h" |
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 #include "../libvo/fastmemcpy.h" |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
36 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
37 #define PARAM1_DEFAULT 4.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
38 #define PARAM2_DEFAULT 3.0 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
39 #define PARAM3_DEFAULT 6.0 |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
43 struct vf_priv_s { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
44 int Coefs[4][512]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
45 unsigned char *Line; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
46 mp_image_t *pmpi; |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
53 static int config(struct vf_instance_s* vf, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
54 int width, int height, int d_width, int d_height, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
55 unsigned int flags, unsigned int outfmt){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
56 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
57 if(vf->priv->Line) free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
58 vf->priv->Line = malloc(width); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
59 vf->priv->pmpi=NULL; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
60 // vf->default_caps &= !VFCAP_ACCEPT_STRIDE; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
61 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
62 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
|
63 } |
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 |
9439 | 66 static void uninit(struct vf_instance_s* vf) |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
67 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
68 free(vf->priv->Line); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
69 } |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
70 |
9365 | 71 #define LowPass(Prev, Curr, Coef) (Curr + Coef[Prev - Curr]) |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
72 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
73 static void deNoise(unsigned char *Frame, // mpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
74 unsigned char *FramePrev, // pmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
75 unsigned char *FrameDest, // dmpi->planes[x] |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
76 unsigned char *LineAnt, // vf->priv->Line (width bytes) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
77 int W, int H, int sStride, int pStride, int dStride, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
78 int *Horizontal, int *Vertical, int *Temporal) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
79 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
80 int X, Y; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
81 int sLineOffs = 0, pLineOffs = 0, dLineOffs = 0; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
82 unsigned char PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
83 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
84 /* First pixel has no left nor top neightbour. Only previous frame */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
85 LineAnt[0] = PixelAnt = Frame[0]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
86 FrameDest[0] = LowPass(FramePrev[0], LineAnt[0], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
87 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
88 /* Fist line has no top neightbour. Only left one for each pixel and |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
89 * last frame */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
90 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
91 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
92 PixelAnt = LowPass(PixelAnt, Frame[X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
93 LineAnt[X] = PixelAnt; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
94 FrameDest[X] = LowPass(FramePrev[X], LineAnt[X], Temporal); |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
97 for (Y = 1; Y < H; Y++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
98 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
99 sLineOffs += sStride, pLineOffs += pStride, dLineOffs += dStride; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
100 /* First pixel on each line doesn't have previous pixel */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
101 PixelAnt = Frame[sLineOffs]; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
102 LineAnt[0] = LowPass(LineAnt[0], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
103 FrameDest[dLineOffs] = LowPass(FramePrev[pLineOffs], LineAnt[0], Temporal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
104 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
105 for (X = 1; X < W; X++) |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
106 { |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
107 /* The rest are normal */ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
108 PixelAnt = LowPass(PixelAnt, Frame[sLineOffs+X], Horizontal); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
109 LineAnt[X] = LowPass(LineAnt[X], PixelAnt, Vertical); |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
110 FrameDest[dLineOffs+X] = LowPass(FramePrev[pLineOffs+X], LineAnt[X], Temporal); |
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 |
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 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
118 int cw= mpi->w >> mpi->chroma_x_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
119 int ch= mpi->h >> mpi->chroma_y_shift; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
120 int W = mpi->w, H = mpi->h; |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
121 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
122 mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
123 MP_IMGTYPE_IP, MP_IMGFLAG_ACCEPT_STRIDE, |
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 |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
149 return vf_next_put_image(vf,dmpi); |
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 |
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff
changeset
|
263 vf_info_t vf_info_denoise3d = { |
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 //===========================================================================// |