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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
2 * Copyright (C) 2003 Daniel Moreno <comac@comac.darktech.org>
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
3 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
4 * This file is part of MPlayer.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
5 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
7 * it under the terms of the GNU General Public License as published by
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
9 * (at your option) any later version.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
10 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
14 * GNU General Public License for more details.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
15 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
16 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
19 */
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
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16684
diff changeset
27 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16684
diff changeset
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
arpi
parents: 9365
diff changeset
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
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
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
33e93b55fbee neightbour --> neighbor typo fix
diego
parents: 16156
diff changeset
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
33e93b55fbee neightbour --> neighbor typo fix
diego
parents: 16156
diff changeset
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
arpi
parents: 9179
diff changeset
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
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
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
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
184 // Ct[256+i] = lround(pow(Simil, Gamma) * (double)i);
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
185 C = pow(Simil, Gamma) * (double)i;
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
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
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 23373
diff changeset
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 //===========================================================================//