annotate libmpcodecs/vf_denoise3d.c @ 32617:1baaacf00bbb

Improve speex codec pts handling, make audio timestamps work reasonably even with the native demuxer as long as seeking is not done.
author reimar
date Sun, 12 Dec 2010 12:36:56 +0000
parents 8fa2f43cb760
children 7af3e6f901fd
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 "mp_msg.h"
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
28 #include "img_format.h"
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
29 #include "mp_image.h"
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
30 #include "vf.h"
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 #define PARAM1_DEFAULT 4.0
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
33 #define PARAM2_DEFAULT 3.0
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
34 #define PARAM3_DEFAULT 6.0
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
35
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
36 //===========================================================================//
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 struct vf_priv_s {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
39 int Coefs[4][512];
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
40 unsigned char *Line;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
41 mp_image_t *pmpi;
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
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
45 /***************************************************************************/
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
46
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
47
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
48 static int config(struct vf_instance *vf,
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
49 int width, int height, int d_width, int d_height,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
50 unsigned int flags, unsigned int outfmt){
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
51
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 30642
diff changeset
52 free(vf->priv->Line);
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
53 vf->priv->Line = malloc(width);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
54 vf->priv->pmpi=NULL;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
55 // vf->default_caps &= !VFCAP_ACCEPT_STRIDE;
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 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
58 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
59
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
60
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
61 static void uninit(struct vf_instance *vf)
9179
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 free(vf->priv->Line);
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
9365
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
66 #define LowPass(Prev, Curr, Coef) (Curr + Coef[Prev - Curr])
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 static void deNoise(unsigned char *Frame, // mpi->planes[x]
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
69 unsigned char *FramePrev, // pmpi->planes[x]
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
70 unsigned char *FrameDest, // dmpi->planes[x]
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
71 unsigned char *LineAnt, // vf->priv->Line (width bytes)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
72 int W, int H, int sStride, int pStride, int dStride,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
73 int *Horizontal, int *Vertical, int *Temporal)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
74 {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
75 int X, Y;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
76 int sLineOffs = 0, pLineOffs = 0, dLineOffs = 0;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
77 unsigned char PixelAnt;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
78
16684
33e93b55fbee neightbour --> neighbor typo fix
diego
parents: 16156
diff changeset
79 /* 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
80 LineAnt[0] = PixelAnt = Frame[0];
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
81 FrameDest[0] = LowPass(FramePrev[0], LineAnt[0], Temporal);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
82
16684
33e93b55fbee neightbour --> neighbor typo fix
diego
parents: 16156
diff changeset
83 /* 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
84 * last frame */
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
85 for (X = 1; X < W; X++)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
86 {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
87 PixelAnt = LowPass(PixelAnt, Frame[X], Horizontal);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
88 LineAnt[X] = PixelAnt;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
89 FrameDest[X] = LowPass(FramePrev[X], LineAnt[X], Temporal);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
90 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
91
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
92 for (Y = 1; Y < H; Y++)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
93 {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
94 sLineOffs += sStride, pLineOffs += pStride, dLineOffs += dStride;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
95 /* First pixel on each line doesn't have previous pixel */
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
96 PixelAnt = Frame[sLineOffs];
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
97 LineAnt[0] = LowPass(LineAnt[0], PixelAnt, Vertical);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
98 FrameDest[dLineOffs] = LowPass(FramePrev[pLineOffs], LineAnt[0], Temporal);
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 for (X = 1; X < W; X++)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
101 {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
102 /* The rest are normal */
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
103 PixelAnt = LowPass(PixelAnt, Frame[sLineOffs+X], Horizontal);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
104 LineAnt[X] = LowPass(LineAnt[X], PixelAnt, Vertical);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
105 FrameDest[dLineOffs+X] = LowPass(FramePrev[pLineOffs+X], LineAnt[X], Temporal);
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 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
108 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
109
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
110
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
111
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
112 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
113 int cw= mpi->w >> mpi->chroma_x_shift;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
114 int ch= mpi->h >> mpi->chroma_y_shift;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
115 int W = mpi->w, H = mpi->h;
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 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
118 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
119 MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE,
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
120 mpi->w,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 if(!dmpi) return 0;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
123 if (!vf->priv->pmpi) vf->priv->pmpi=mpi;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
124
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
125 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
126 vf->priv->Line, W, H,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
127 mpi->stride[0], vf->priv->pmpi->stride[0], dmpi->stride[0],
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
128 vf->priv->Coefs[0] + 256,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
129 vf->priv->Coefs[0] + 256,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
130 vf->priv->Coefs[1] + 256);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
131 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
132 vf->priv->Line, cw, ch,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
133 mpi->stride[1], vf->priv->pmpi->stride[1], dmpi->stride[1],
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
134 vf->priv->Coefs[2] + 256,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
135 vf->priv->Coefs[2] + 256,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
136 vf->priv->Coefs[3] + 256);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
137 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
138 vf->priv->Line, cw, ch,
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
139 mpi->stride[2], vf->priv->pmpi->stride[2], dmpi->stride[2],
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
9182
arpi
parents: 9179
diff changeset
144 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
145 return vf_next_put_image(vf,dmpi, pts);
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
146 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
147
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
148 //===========================================================================//
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
149
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
150 static int query_format(struct vf_instance *vf, unsigned int fmt){
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
151 switch(fmt)
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 case IMGFMT_YV12:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
154 case IMGFMT_I420:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
155 case IMGFMT_IYUV:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
156 case IMGFMT_YVU9:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
157 case IMGFMT_444P:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
158 case IMGFMT_422P:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
159 case IMGFMT_411P:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
160 return vf_next_query_format(vf, fmt);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
161 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
162 return 0;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
163 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
164
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 #define ABS(A) ( (A) > 0 ? (A) : -(A) )
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 static void PrecalcCoefs(int *Ct, double Dist25)
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 int i;
9365
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
171 double Gamma, Simil, C;
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
172
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
173 Gamma = log(0.25) / log(1.0 - Dist25/255.0);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
174
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
175 for (i = -256; i <= 255; i++)
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 Simil = 1.0 - ABS(i) / 255.0;
9365
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
178 // Ct[256+i] = lround(pow(Simil, Gamma) * (double)i);
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
179 C = pow(Simil, Gamma) * (double)i;
6fc781450b22 cleanup & more optimize
arpi
parents: 9358
diff changeset
180 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
181 }
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
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
184
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29087
diff changeset
185 static int vf_open(vf_instance_t *vf, char *args){
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
186 double LumSpac, LumTmp, ChromSpac, ChromTmp;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
187 double Param1, Param2, Param3;
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 vf->config=config;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
190 vf->put_image=put_image;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
191 vf->query_format=query_format;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
192 vf->uninit=uninit;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
193 vf->priv=malloc(sizeof(struct vf_priv_s));
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
194 memset(vf->priv, 0, sizeof(struct vf_priv_s));
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
195
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
196 if (args)
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
197 {
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
198 switch(sscanf(args, "%lf:%lf:%lf",
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
199 &Param1, &Param2, &Param3
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
200 ))
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 case 0:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
203 LumSpac = PARAM1_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
204 LumTmp = PARAM3_DEFAULT;
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 ChromSpac = PARAM2_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
207 ChromTmp = LumTmp * ChromSpac / LumSpac;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
208 break;
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 case 1:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
211 LumSpac = Param1;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
212 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT;
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 ChromSpac = PARAM2_DEFAULT * Param1 / PARAM1_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
215 ChromTmp = LumTmp * ChromSpac / LumSpac;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
216 break;
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 case 2:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
219 LumSpac = Param1;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
220 LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT;
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 ChromSpac = Param2;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
223 ChromTmp = LumTmp * ChromSpac / LumSpac;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
224 break;
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 case 3:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
227 LumSpac = Param1;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
228 LumTmp = Param3;
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 ChromSpac = Param2;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
231 ChromTmp = LumTmp * ChromSpac / LumSpac;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
232 break;
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 default:
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
235 LumSpac = PARAM1_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
236 LumTmp = PARAM3_DEFAULT;
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 ChromSpac = PARAM2_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
239 ChromTmp = LumTmp * ChromSpac / LumSpac;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
240 }
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 else
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 LumSpac = PARAM1_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
245 LumTmp = PARAM3_DEFAULT;
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 ChromSpac = PARAM2_DEFAULT;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
248 ChromTmp = LumTmp * ChromSpac / LumSpac;
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
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
251 PrecalcCoefs(vf->priv->Coefs[0], LumSpac);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
252 PrecalcCoefs(vf->priv->Coefs[1], LumTmp);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
253 PrecalcCoefs(vf->priv->Coefs[2], ChromSpac);
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
254 PrecalcCoefs(vf->priv->Coefs[3], ChromTmp);
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 return 1;
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
257 }
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
258
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 23373
diff changeset
259 const vf_info_t vf_info_denoise3d = {
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
260 "3D Denoiser (variable lowpass filter)",
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
261 "denoise3d",
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
262 "Daniel Moreno",
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
263 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29087
diff changeset
264 vf_open,
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9439
diff changeset
265 NULL
9179
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
266 };
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
267
e93a0dd3ed56 new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
diff changeset
268 //===========================================================================//