annotate libmpcodecs/vf_ow.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 a972c1a4a012
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
2 * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
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 */
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
20
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
21 /**
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
22 * @todo try to change to int
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
23 * @todo try lifting based implementation
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
24 * @todo optimize optimize optimize
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
25 * @todo hard tresholding
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
26 * @todo use QP to decide filter strength
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
27 * @todo wavelet normalization / least squares optimal signal vs. noise thresholds
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
28 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
29
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
30 #include <stdio.h>
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
31 #include <string.h>
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
32 #include <inttypes.h>
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
33 #include <math.h>
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
34
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
35 #include "mp_msg.h"
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
36 #include "img_format.h"
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
37 #include "mp_image.h"
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
38 #include "vf.h"
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
39
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
40 //===========================================================================//
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
41 static const uint8_t __attribute__((aligned(8))) dither[8][8]={
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
42 { 0, 48, 12, 60, 3, 51, 15, 63, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
43 { 32, 16, 44, 28, 35, 19, 47, 31, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
44 { 8, 56, 4, 52, 11, 59, 7, 55, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
45 { 40, 24, 36, 20, 43, 27, 39, 23, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
46 { 2, 50, 14, 62, 1, 49, 13, 61, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
47 { 34, 18, 46, 30, 33, 17, 45, 29, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
48 { 10, 58, 6, 54, 9, 57, 5, 53, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
49 { 42, 26, 38, 22, 41, 25, 37, 21, },
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
50 };
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
51 //FIXME the above is duplicated in many filters
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
52
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
53 struct vf_priv_s {
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
54 float strength[2];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
55 float delta;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
56 int mode;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
57 int depth;
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
58 float *plane[16][4];
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
59 int stride;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
60 };
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
61
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
62 #define S 1.41421356237 //sqrt(2)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
63
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
64 static const double coeff[2][5]={
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
65 {
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
66 0.6029490182363579 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
67 0.2668641184428723 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
68 -0.07822326652898785 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
69 -0.01686411844287495 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
70 0.02674875741080976 *S
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
71 },{
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
72 1.115087052456994 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
73 -0.5912717631142470 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
74 -0.05754352622849957 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
75 0.09127176311424948 /S
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
76 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
77 };
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
78
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
79 static const double icoeff[2][5]={
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
80 {
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
81 1.115087052456994 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
82 0.5912717631142470 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
83 -0.05754352622849957 /S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
84 -0.09127176311424948 /S
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
85 },{
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
86 0.6029490182363579 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
87 -0.2668641184428723 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
88 -0.07822326652898785 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
89 0.01686411844287495 *S,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
90 0.02674875741080976 *S
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
91 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
92 };
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
93 #undef S
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
94
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
95 static inline int mirror(int x, int w){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
96 while((unsigned)x > (unsigned)w){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
97 x=-x;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
98 if(x<0) x+= 2*w;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
99 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
100 return x;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
101 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
102
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
103 static inline void decompose(float *dstL, float *dstH, float *src, int stride, int w){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
104 int x, i;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
105 for(x=0; x<w; x++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
106 double sumL= src[x*stride] * coeff[0][0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
107 double sumH= src[x*stride] * coeff[1][0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
108 for(i=1; i<=4; i++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
109 double s= (src[mirror(x-i, w-1)*stride] + src[mirror(x+i, w-1)*stride]);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
110
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
111 sumL+= coeff[0][i]*s;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
112 sumH+= coeff[1][i]*s;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
113 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
114 dstL[x*stride]= sumL;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
115 dstH[x*stride]= sumH;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
116 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
117 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
118
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
119 static inline void compose(float *dst, float *srcL, float *srcH, int stride, int w){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
120 int x, i;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
121 for(x=0; x<w; x++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
122 double sumL= srcL[x*stride] * icoeff[0][0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
123 double sumH= srcH[x*stride] * icoeff[1][0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
124 for(i=1; i<=4; i++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
125 int x0= mirror(x-i, w-1)*stride;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
126 int x1= mirror(x+i, w-1)*stride;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
127
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
128 sumL+= icoeff[0][i]*(srcL[x0] + srcL[x1]);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
129 sumH+= icoeff[1][i]*(srcH[x0] + srcH[x1]);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
130 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
131 dst[x*stride]= (sumL + sumH)*0.5;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
132 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
133 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
134
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
135 static inline void decompose2D(float *dstL, float *dstH, float *src, int xstride, int ystride, int step, int w, int h){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
136 int y, x;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
137 for(y=0; y<h; y++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
138 for(x=0; x<step; x++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
139 decompose(dstL + ystride*y + xstride*x, dstH + ystride*y + xstride*x, src + ystride*y + xstride*x, step*xstride, (w-x+step-1)/step);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
140 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
141
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
142 static inline void compose2D(float *dst, float *srcL, float *srcH, int xstride, int ystride, int step, int w, int h){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
143 int y, x;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
144 for(y=0; y<h; y++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
145 for(x=0; x<step; x++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
146 compose(dst + ystride*y + xstride*x, srcL + ystride*y + xstride*x, srcH + ystride*y + xstride*x, step*xstride, (w-x+step-1)/step);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
147 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
148
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
149 static void decompose2D2(float *dst[4], float *src, float *temp[2], int stride, int step, int w, int h){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
150 decompose2D(temp[0], temp[1], src , 1, stride, step , w, h);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
151 decompose2D( dst[0], dst[1], temp[0], stride, 1, step , h, w);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
152 decompose2D( dst[2], dst[3], temp[1], stride, 1, step , h, w);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
153 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
154
24680
4d56303b85ab change double arrays to float (this should be accurate enough)
michael
parents: 24679
diff changeset
155 static void compose2D2(float *dst, float *src[4], float *temp[2], int stride, int step, int w, int h){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
156 compose2D(temp[0], src[0], src[1], stride, 1, step , h, w);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
157 compose2D(temp[1], src[2], src[3], stride, 1, step , h, w);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
158 compose2D(dst , temp[0], temp[1], 1, stride, step , w, h);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
159 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
160
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
161 static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src, int dst_stride, int src_stride, int width, int height, int is_luma){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
162 int x,y, i, j;
24808
1318366cf2da fix warning:
diego
parents: 24680
diff changeset
163 // double sum=0;
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
164 double s= p->strength[!is_luma];
24679
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
165 int depth= p->depth;
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
166
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
167 while(1<<depth > width || 1<<depth > height)
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
168 depth--;
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
169
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
170 for(y=0; y<height; y++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
171 for(x=0; x<width; x++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
172 p->plane[0][0][x + y*p->stride]= src[x + y*src_stride];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
173
24679
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
174 for(i=0; i<depth; i++){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
175 decompose2D2(p->plane[i+1], p->plane[i][0], p->plane[0]+1,p->stride, 1<<i, width, height);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
176 }
24679
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
177 for(i=0; i<depth; i++){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
178 for(j=1; j<4; j++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
179 for(y=0; y<height; y++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
180 for(x=0; x<width; x++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
181 double v= p->plane[i+1][j][x + y*p->stride];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
182 if (v> s) v-=s;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
183 else if(v<-s) v+=s;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
184 else v =0;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
185 p->plane[i+1][j][x + y*p->stride]= v;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
186 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
187 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
188 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
189 }
24679
065d1f97815f fix infinite loop
michael
parents: 24677
diff changeset
190 for(i=depth-1; i>=0; i--){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
191 compose2D2(p->plane[i][0], p->plane[i+1], p->plane[0]+1, p->stride, 1<<i, width, height);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
192 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
193
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
194 for(y=0; y<height; y++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
195 for(x=0; x<width; x++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
196 i= p->plane[0][0][x + y*p->stride] + dither[x&7][y&7]*(1.0/64) + 1.0/128; //yes the rounding is insane but optimal :)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
197 // double e= i - src[x + y*src_stride];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
198 // sum += e*e;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
199 if((unsigned)i > 255U) i= ~(i>>31);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
200 dst[x + y*dst_stride]= i;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
201 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
202
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
203 // printf("%f\n", sum/height/width);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
204 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
205
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
206 static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
207 int h= (height+15)&(~15);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
208 int i,j;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
209
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
210 vf->priv->stride= (width+15)&(~15);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
211 for(j=0; j<4; j++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
212 for(i=0; i<=vf->priv->depth; i++)
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
213 vf->priv->plane[i][j]= malloc(vf->priv->stride*h*sizeof(vf->priv->plane[0][0][0]));
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
214 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
215
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
216 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
217 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
218
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
219 static void get_image(struct vf_instance *vf, mp_image_t *mpi){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
220 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
221 // ok, we can do pp in-place (or pp disabled):
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
222 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
223 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
224 mpi->planes[0]=vf->dmpi->planes[0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
225 mpi->stride[0]=vf->dmpi->stride[0];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
226 mpi->width=vf->dmpi->width;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
227 if(mpi->flags&MP_IMGFLAG_PLANAR){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
228 mpi->planes[1]=vf->dmpi->planes[1];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
229 mpi->planes[2]=vf->dmpi->planes[2];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
230 mpi->stride[1]=vf->dmpi->stride[1];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
231 mpi->stride[2]=vf->dmpi->stride[2];
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
232 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
233 mpi->flags|=MP_IMGFLAG_DIRECT;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
234 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
235
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
236 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
237 mp_image_t *dmpi;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
238
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
239 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
240 // no DR, so get a new image! hope we'll get DR buffer:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
241 dmpi=vf_get_image(vf->next,mpi->imgfmt,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
242 MP_IMGTYPE_TEMP,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
243 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
244 mpi->width,mpi->height);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
245 vf_clone_mpi_attributes(dmpi, mpi);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
246 }else{
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
247 dmpi=vf->dmpi;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
248 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
249
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
250 filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, 1);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
251 filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
252 filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
253
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
254 return vf_next_put_image(vf,dmpi, pts);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
255 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
256
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
257 static void uninit(struct vf_instance *vf){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
258 int i,j;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
259 if(!vf->priv) return;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
260
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
261 for(j=0; j<4; j++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
262 for(i=0; i<16; i++){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
263 free(vf->priv->plane[i][j]);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
264 vf->priv->plane[i][j]= NULL;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
265 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
266 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
267
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
268 free(vf->priv);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
269 vf->priv=NULL;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
270 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
271
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
272 //===========================================================================//
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
273 static int query_format(struct vf_instance *vf, unsigned int fmt){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
274 switch(fmt){
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
275 case IMGFMT_YVU9:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
276 case IMGFMT_IF09:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
277 case IMGFMT_YV12:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
278 case IMGFMT_I420:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
279 case IMGFMT_IYUV:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
280 case IMGFMT_CLPL:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
281 case IMGFMT_Y800:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
282 case IMGFMT_Y8:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
283 case IMGFMT_444P:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
284 case IMGFMT_422P:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
285 case IMGFMT_411P:
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
286 return vf_next_query_format(vf,fmt);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
287 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
288 return 0;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
289 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
290
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
291
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
292 static int vf_open(vf_instance_t *vf, char *args){
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
293 vf->config=config;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
294 vf->put_image=put_image;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
295 vf->get_image=get_image;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
296 vf->query_format=query_format;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
297 vf->uninit=uninit;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
298 vf->priv=malloc(sizeof(struct vf_priv_s));
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
299 memset(vf->priv, 0, sizeof(struct vf_priv_s));
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
300
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
301 vf->priv->depth= 8;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
302 vf->priv->strength[0]= 1.0;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
303 vf->priv->strength[1]= 1.0;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
304 vf->priv->delta= 1.0;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
305
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
306 if (args) sscanf(args, "%d:%f:%f:%d:%f", &vf->priv->depth,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
307 &vf->priv->strength[0],
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
308 &vf->priv->strength[1],
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
309 &vf->priv->mode,
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
310 &vf->priv->delta);
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
311
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
312 return 1;
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
313 }
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
314
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24865
diff changeset
315 const vf_info_t vf_info_ow = {
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
316 "overcomplete wavelet denoiser",
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
317 "ow",
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
318 "Michael Niedermayer",
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
319 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
320 vf_open,
24677
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
321 NULL
9f81c2175803 overcomplete wavelet denoiser
michael
parents:
diff changeset
322 };