Mercurial > mplayer.hg
annotate libmpcodecs/vf_test.c @ 15533:ddf15d233d58
Do not switch to audio tracks whose codec private data differs from the main audio track's as this will most likely result in messed up audio output. Patch by Michael Behrisch <list () behrisch ! de>
author | mosu |
---|---|
date | Sat, 21 May 2005 06:50:08 +0000 |
parents | e9a2af584986 |
children | 6ff3379a0862 |
rev | line source |
---|---|
6278 | 1 /* |
2 Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> | |
3 | |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2 of the License, or | |
7 (at your option) any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 */ | |
18 | |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <inttypes.h> | |
23 | |
24 #include "../config.h" | |
25 #include "../mp_msg.h" | |
26 | |
27 #include "img_format.h" | |
28 #include "mp_image.h" | |
29 #include "vf.h" | |
30 | |
31 #include "../libvo/fastmemcpy.h" | |
32 | |
33 //===========================================================================// | |
34 | |
35 #include <inttypes.h> | |
36 #include <math.h> | |
37 | |
38 #define MAX(a,b) ((a) > (b) ? (a) : (b)) | |
39 #define MIN(a,b) ((a) < (b) ? (a) : (b)) | |
40 #define ABS(a,b) ((a) > 0 ? (a) : -(a)) | |
41 | |
42 #define WIDTH 512 | |
43 #define HEIGHT 512 | |
44 | |
6413 | 45 struct vf_priv_s { |
46 int frame_num; | |
47 }; | |
48 | |
6278 | 49 static int config(struct vf_instance_s* vf, |
50 int width, int height, int d_width, int d_height, | |
51 unsigned int flags, unsigned int outfmt){ | |
52 | |
53 if(vf_next_query_format(vf,IMGFMT_YV12)<=0){ | |
54 printf("yv12 not supported by next filter/vo :(\n"); | |
55 return 0; | |
56 } | |
57 | |
58 //hmm whats the meaning of these ... ;) | |
59 d_width= width= WIDTH; | |
60 d_height= height= HEIGHT; | |
61 | |
62 return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_YV12); | |
63 } | |
64 | |
65 static double c[64]; | |
66 | |
67 static void initIdct() | |
68 { | |
69 int i; | |
70 | |
71 for (i=0; i<8; i++) | |
72 { | |
73 double s= i==0 ? sqrt(0.125) : 0.5; | |
74 int j; | |
75 | |
76 for(j=0; j<8; j++) | |
77 c[i*8+j]= s*cos((3.141592654/8.0)*i*(j+0.5)); | |
78 } | |
79 } | |
80 | |
81 | |
82 static void idct(uint8_t *dst, int dstStride, int src[64]) | |
83 { | |
84 int i, j, k; | |
85 double tmp[64]; | |
86 | |
87 for(i=0; i<8; i++) | |
88 { | |
89 for(j=0; j<8; j++) | |
90 { | |
91 double sum= 0.0; | |
92 | |
93 for(k=0; k<8; k++) | |
94 sum+= c[k*8+j]*src[8*i+k]; | |
95 | |
96 tmp[8*i+j]= sum; | |
97 } | |
98 } | |
99 | |
100 for(j=0; j<8; j++) | |
101 { | |
102 for(i=0; i<8; i++) | |
103 { | |
104 int v; | |
105 double sum= 0.0; | |
106 | |
107 for(k=0; k<8; k++) | |
108 sum+= c[k*8+i]*tmp[8*k+j]; | |
109 | |
6413 | 110 v= (int)floor(sum+0.5); |
6278 | 111 if(v<0) v=0; |
112 else if(v>255) v=255; | |
113 | |
114 dst[dstStride*i + j] = v; | |
115 } | |
116 } | |
117 } | |
118 | |
119 static void drawDc(uint8_t *dst, int stride, int color, int w, int h) | |
120 { | |
121 int y; | |
122 for(y=0; y<h; y++) | |
123 { | |
124 int x; | |
125 for(x=0; x<w; x++) | |
126 { | |
127 dst[x + y*stride]= color; | |
128 } | |
129 } | |
130 } | |
131 | |
132 static void drawBasis(uint8_t *dst, int stride, int amp, int freq, int dc) | |
133 { | |
134 int src[64]; | |
135 | |
136 memset(src, 0, 64*sizeof(int)); | |
137 src[0]= dc; | |
138 if(amp) src[freq]= amp; | |
139 idct(dst, stride, src); | |
140 } | |
141 | |
142 static void drawCbp(uint8_t *dst[3], int stride[3], int cbp, int amp, int dc) | |
143 { | |
144 if(cbp&1) drawBasis(dst[0] , stride[0], amp, 1, dc); | |
145 if(cbp&2) drawBasis(dst[0]+8 , stride[0], amp, 1, dc); | |
146 if(cbp&4) drawBasis(dst[0]+ 8*stride[0], stride[0], amp, 1, dc); | |
147 if(cbp&8) drawBasis(dst[0]+8+8*stride[0], stride[0], amp, 1, dc); | |
148 if(cbp&16)drawBasis(dst[1] , stride[1], amp, 1, dc); | |
149 if(cbp&32)drawBasis(dst[2] , stride[2], amp, 1, dc); | |
150 } | |
151 | |
152 static void dc1Test(uint8_t *dst, int stride, int w, int h, int off) | |
153 { | |
154 const int step= MAX(256/(w*h/256), 1); | |
155 int y; | |
156 int color=off; | |
157 for(y=0; y<h; y+=16) | |
158 { | |
159 int x; | |
160 for(x=0; x<w; x+=16) | |
161 { | |
162 drawDc(dst + x + y*stride, stride, color, 8, 8); | |
163 color+=step; | |
164 } | |
165 } | |
166 } | |
167 | |
168 static void freq1Test(uint8_t *dst, int stride, int off) | |
169 { | |
170 int y; | |
171 int freq=0; | |
172 for(y=0; y<8*16; y+=16) | |
173 { | |
174 int x; | |
175 for(x=0; x<8*16; x+=16) | |
176 { | |
6413 | 177 drawBasis(dst + x + y*stride, stride, 4*(96+off), freq, 128*8); |
6278 | 178 freq++; |
179 } | |
180 } | |
181 } | |
182 | |
183 static void amp1Test(uint8_t *dst, int stride, int off) | |
184 { | |
185 int y; | |
186 int amp=off; | |
187 for(y=0; y<16*16; y+=16) | |
188 { | |
189 int x; | |
190 for(x=0; x<16*16; x+=16) | |
191 { | |
192 drawBasis(dst + x + y*stride, stride, 4*(amp), 1, 128*8); | |
193 amp++; | |
194 } | |
195 } | |
196 } | |
197 | |
198 static void cbp1Test(uint8_t *dst[3], int stride[3], int off) | |
199 { | |
200 int y; | |
201 int cbp=0; | |
202 for(y=0; y<16*8; y+=16) | |
203 { | |
204 int x; | |
205 for(x=0; x<16*8; x+=16) | |
206 { | |
207 uint8_t *dst1[3]; | |
208 dst1[0]= dst[0] + x*2 + y*2*stride[0]; | |
209 dst1[1]= dst[1] + x + y*stride[1]; | |
210 dst1[2]= dst[2] + x + y*stride[2]; | |
211 | |
212 drawCbp(dst1, stride, cbp, (64+off)*4, 128*8); | |
213 cbp++; | |
214 } | |
215 } | |
216 } | |
217 | |
218 static void mv1Test(uint8_t *dst, int stride, int off) | |
219 { | |
220 int y; | |
221 for(y=0; y<16*16; y++) | |
222 { | |
223 int x; | |
224 if(y&16) continue; | |
225 for(x=0; x<16*16; x++) | |
226 { | |
227 dst[x + y*stride]= x + off*8/(y/32+1); | |
228 } | |
229 } | |
230 } | |
231 | |
6413 | 232 static void ring1Test(uint8_t *dst, int stride, int off) |
233 { | |
234 int y; | |
235 int color=0; | |
236 for(y=off; y<16*16; y+=16) | |
237 { | |
238 int x; | |
239 for(x=off; x<16*16; x+=16) | |
240 { | |
241 drawDc(dst + x + y*stride, stride, ((x+y)&16) ? color : -color, 16, 16); | |
242 // dst[x + y*stride]= 255 + (off&1); | |
243 color++; | |
244 } | |
245 } | |
246 } | |
247 | |
248 static void ring2Test(uint8_t *dst, int stride, int off) | |
249 { | |
250 int y; | |
251 for(y=0; y<16*16; y++) | |
252 { | |
253 int x; | |
254 for(x=0; x<16*16; x++) | |
255 { | |
256 double d= sqrt((x-8*16)*(x-8*16) + (y-8*16)*(y-8*16)); | |
257 double r= d/20 - (int)(d/20); | |
258 if(r<off/30.0) | |
259 { | |
260 dst[x + y*stride]= 255; | |
261 dst[x + y*stride+256]= 0; | |
262 } | |
263 else{ | |
264 dst[x + y*stride]= x; | |
265 dst[x + y*stride+256]= x; | |
266 } | |
267 } | |
268 } | |
269 } | |
270 | |
7368 | 271 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ |
6278 | 272 mp_image_t *dmpi; |
6413 | 273 int frame= vf->priv->frame_num; |
6278 | 274 |
275 // hope we'll get DR buffer: | |
276 dmpi=vf_get_image(vf->next,IMGFMT_YV12, | |
277 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, | |
278 WIDTH, HEIGHT); | |
279 | |
280 // clean | |
281 memset(dmpi->planes[0], 0, dmpi->stride[0]*dmpi->h); | |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6413
diff
changeset
|
282 memset(dmpi->planes[1], 128, dmpi->stride[1]*dmpi->h>>dmpi->chroma_y_shift); |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6413
diff
changeset
|
283 memset(dmpi->planes[2], 128, dmpi->stride[2]*dmpi->h>>dmpi->chroma_y_shift); |
6278 | 284 |
285 if(frame%30) | |
286 { | |
287 switch(frame/30) | |
288 { | |
289 case 0: dc1Test(dmpi->planes[0], dmpi->stride[0], 256, 256, frame%30); break; | |
290 case 1: dc1Test(dmpi->planes[1], dmpi->stride[1], 256, 256, frame%30); break; | |
291 case 2: freq1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; | |
292 case 3: freq1Test(dmpi->planes[1], dmpi->stride[1], frame%30); break; | |
293 case 4: amp1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; | |
294 case 5: amp1Test(dmpi->planes[1], dmpi->stride[1], frame%30); break; | |
295 case 6: cbp1Test(dmpi->planes , dmpi->stride , frame%30); break; | |
296 case 7: mv1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; | |
6413 | 297 case 8: ring1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; |
298 case 9: ring2Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; | |
6278 | 299 } |
300 } | |
301 | |
302 frame++; | |
6413 | 303 vf->priv->frame_num= frame; |
7368 | 304 return vf_next_put_image(vf,dmpi); |
6278 | 305 } |
306 | |
307 //===========================================================================// | |
308 | |
309 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
310 return vf_next_query_format(vf,IMGFMT_YV12) & (~VFCAP_CSP_SUPPORTED_BY_HW); | |
311 } | |
312 | |
313 static int open(vf_instance_t *vf, char* args){ | |
314 vf->config=config; | |
315 vf->put_image=put_image; | |
316 vf->query_format=query_format; | |
6413 | 317 vf->priv=malloc(sizeof(struct vf_priv_s)); |
318 vf->priv->frame_num= args ? atoi(args) : 0; | |
6278 | 319 initIdct(); |
320 return 1; | |
321 } | |
322 | |
323 vf_info_t vf_info_test = { | |
324 "test pattern generator", | |
325 "test", | |
326 "Michael Niedermayer", | |
327 "", | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
7368
diff
changeset
|
328 open, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
7368
diff
changeset
|
329 NULL |
6278 | 330 }; |
331 | |
332 //===========================================================================// |