Tizen 2.0 Release
[framework/multimedia/gst-plugins-good0.10.git] / tests / check / elements / audiowsinclimit.c
1 /* GStreamer
2  *
3  * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
4  *
5  * audiowsinclimit.c: Unit test for the audiowsinclimit element
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  * 
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  * 
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22
23 #include <gst/gst.h>
24 #include <gst/base/gstbasetransform.h>
25 #include <gst/check/gstcheck.h>
26
27 #include <math.h>
28
29 /* For ease of programming we use globals to keep refs for our floating
30  * src and sink pads we create; otherwise we always have to do get_pad,
31  * get_peer, and then remove references in every test function */
32 GstPad *mysrcpad, *mysinkpad;
33
34 #define AUDIO_WSINC_LIMIT_CAPS_STRING_32           \
35     "audio/x-raw-float, "               \
36     "channels = (int) 1, "              \
37     "rate = (int) 44100, "              \
38     "endianness = (int) BYTE_ORDER, "   \
39     "width = (int) 32"                  \
40
41 #define AUDIO_WSINC_LIMIT_CAPS_STRING_64           \
42     "audio/x-raw-float, "               \
43     "channels = (int) 1, "              \
44     "rate = (int) 44100, "              \
45     "endianness = (int) BYTE_ORDER, "   \
46     "width = (int) 64"                  \
47
48 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
49     GST_PAD_SINK,
50     GST_PAD_ALWAYS,
51     GST_STATIC_CAPS ("audio/x-raw-float, "
52         "channels = (int) 1, "
53         "rate = (int) 44100, "
54         "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ")
55     );
56 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
57     GST_PAD_SRC,
58     GST_PAD_ALWAYS,
59     GST_STATIC_CAPS ("audio/x-raw-float, "
60         "channels = (int) 1, "
61         "rate = (int) 44100, "
62         "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ")
63     );
64
65 static GstElement *
66 setup_audiowsinclimit (void)
67 {
68   GstElement *audiowsinclimit;
69
70   GST_DEBUG ("setup_audiowsinclimit");
71   audiowsinclimit = gst_check_setup_element ("audiowsinclimit");
72   mysrcpad = gst_check_setup_src_pad (audiowsinclimit, &srctemplate, NULL);
73   mysinkpad = gst_check_setup_sink_pad (audiowsinclimit, &sinktemplate, NULL);
74   gst_pad_set_active (mysrcpad, TRUE);
75   gst_pad_set_active (mysinkpad, TRUE);
76
77   return audiowsinclimit;
78 }
79
80 static void
81 cleanup_audiowsinclimit (GstElement * audiowsinclimit)
82 {
83   GST_DEBUG ("cleanup_audiowsinclimit");
84
85   g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
86   g_list_free (buffers);
87   buffers = NULL;
88
89   gst_pad_set_active (mysrcpad, FALSE);
90   gst_pad_set_active (mysinkpad, FALSE);
91   gst_check_teardown_src_pad (audiowsinclimit);
92   gst_check_teardown_sink_pad (audiowsinclimit);
93   gst_check_teardown_element (audiowsinclimit);
94 }
95
96 /* Test if data containing only one frequency component
97  * at 0 is preserved with lowpass mode and a cutoff
98  * at rate/4 */
99 GST_START_TEST (test_32_lp_0hz)
100 {
101   GstElement *audiowsinclimit;
102   GstBuffer *inbuffer, *outbuffer;
103   GstCaps *caps;
104   gfloat *in, *res, rms;
105   gint i;
106   GList *node;
107
108   audiowsinclimit = setup_audiowsinclimit ();
109   /* Set to lowpass */
110   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
111   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
112
113   fail_unless (gst_element_set_state (audiowsinclimit,
114           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
115       "could not set to playing");
116
117   /* cutoff = sampling rate / 4, data = 0 */
118   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
119   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat));
120   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
121   in = (gfloat *) GST_BUFFER_DATA (inbuffer);
122   for (i = 0; i < 128; i++)
123     in[i] = 1.0;
124
125   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32);
126   gst_buffer_set_caps (inbuffer, caps);
127   gst_caps_unref (caps);
128   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
129
130   /* pushing gives away my reference ... */
131   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
132   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
133   /* ... and puts a new buffer on the global list */
134   fail_unless (g_list_length (buffers) >= 1);
135
136   for (node = buffers; node; node = node->next) {
137     gint buffer_length;
138
139     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
140
141     res = (gfloat *) GST_BUFFER_DATA (outbuffer);
142     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat);
143     rms = 0.0;
144     for (i = 0; i < buffer_length; i++)
145       rms += res[i] * res[i];
146     rms = sqrt (rms / buffer_length);
147     fail_unless (rms >= 0.9);
148   }
149
150   /* cleanup */
151   cleanup_audiowsinclimit (audiowsinclimit);
152 }
153
154 GST_END_TEST;
155
156 /* Test if data containing only one frequency component
157  * at rate/2 is erased with lowpass mode and a cutoff
158  * at rate/4 */
159 GST_START_TEST (test_32_lp_22050hz)
160 {
161   GstElement *audiowsinclimit;
162   GstBuffer *inbuffer, *outbuffer;
163   GstCaps *caps;
164   gfloat *in, *res, rms;
165   gint i;
166   GList *node;
167
168   audiowsinclimit = setup_audiowsinclimit ();
169   /* Set to lowpass */
170   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
171   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
172
173   fail_unless (gst_element_set_state (audiowsinclimit,
174           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
175       "could not set to playing");
176
177   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
178   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat));
179   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
180   in = (gfloat *) GST_BUFFER_DATA (inbuffer);
181   for (i = 0; i < 128; i += 2) {
182     in[i] = 1.0;
183     in[i + 1] = -1.0;
184   }
185
186   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32);
187   gst_buffer_set_caps (inbuffer, caps);
188   gst_caps_unref (caps);
189   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
190
191   /* pushing gives away my reference ... */
192   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
193   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
194   /* ... and puts a new buffer on the global list */
195   fail_unless (g_list_length (buffers) >= 1);
196
197   for (node = buffers; node; node = node->next) {
198     gint buffer_length;
199
200     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
201
202     res = (gfloat *) GST_BUFFER_DATA (outbuffer);
203     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat);
204     rms = 0.0;
205     for (i = 0; i < buffer_length; i++)
206       rms += res[i] * res[i];
207     rms = sqrt (rms / buffer_length);
208     fail_unless (rms <= 0.1);
209   }
210
211   /* cleanup */
212   cleanup_audiowsinclimit (audiowsinclimit);
213 }
214
215 GST_END_TEST;
216
217 /* Test if data containing only one frequency component
218  * at 0 is erased with highpass mode and a cutoff
219  * at rate/4 */
220 GST_START_TEST (test_32_hp_0hz)
221 {
222   GstElement *audiowsinclimit;
223   GstBuffer *inbuffer, *outbuffer;
224   GstCaps *caps;
225   gfloat *in, *res, rms;
226   gint i;
227   GList *node;
228
229   audiowsinclimit = setup_audiowsinclimit ();
230   /* Set to highpass */
231   g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL);
232   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
233
234   fail_unless (gst_element_set_state (audiowsinclimit,
235           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
236       "could not set to playing");
237
238   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
239   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat));
240   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
241   in = (gfloat *) GST_BUFFER_DATA (inbuffer);
242   for (i = 0; i < 128; i++)
243     in[i] = 1.0;
244
245   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32);
246   gst_buffer_set_caps (inbuffer, caps);
247   gst_caps_unref (caps);
248   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
249
250   /* pushing gives away my reference ... */
251   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
252   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
253   /* ... and puts a new buffer on the global list */
254   fail_unless (g_list_length (buffers) >= 1);
255
256   for (node = buffers; node; node = node->next) {
257     gint buffer_length;
258
259     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
260
261     res = (gfloat *) GST_BUFFER_DATA (outbuffer);
262     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat);
263     rms = 0.0;
264     for (i = 0; i < buffer_length; i++)
265       rms += res[i] * res[i];
266     rms = sqrt (rms / buffer_length);
267     fail_unless (rms <= 0.1);
268   }
269
270   /* cleanup */
271   cleanup_audiowsinclimit (audiowsinclimit);
272 }
273
274 GST_END_TEST;
275
276 /* Test if data containing only one frequency component
277  * at rate/2 is preserved with highpass mode and a cutoff
278  * at rate/4 */
279 GST_START_TEST (test_32_hp_22050hz)
280 {
281   GstElement *audiowsinclimit;
282   GstBuffer *inbuffer, *outbuffer;
283   GstCaps *caps;
284   gfloat *in, *res, rms;
285   gint i;
286   GList *node;
287
288   audiowsinclimit = setup_audiowsinclimit ();
289   /* Set to highpass */
290   g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL);
291   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
292
293   fail_unless (gst_element_set_state (audiowsinclimit,
294           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
295       "could not set to playing");
296
297   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
298   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat));
299   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
300   in = (gfloat *) GST_BUFFER_DATA (inbuffer);
301   for (i = 0; i < 128; i += 2) {
302     in[i] = 1.0;
303     in[i + 1] = -1.0;
304   }
305
306   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32);
307   gst_buffer_set_caps (inbuffer, caps);
308   gst_caps_unref (caps);
309   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
310
311   /* pushing gives away my reference ... */
312   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
313   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
314   /* ... and puts a new buffer on the global list */
315   fail_unless (g_list_length (buffers) >= 1);
316   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
317
318   for (node = buffers; node; node = node->next) {
319     gint buffer_length;
320
321     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
322
323     res = (gfloat *) GST_BUFFER_DATA (outbuffer);
324     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat);
325     rms = 0.0;
326     for (i = 0; i < buffer_length; i++)
327       rms += res[i] * res[i];
328     rms = sqrt (rms / buffer_length);
329     fail_unless (rms >= 0.9);
330   }
331
332   /* cleanup */
333   cleanup_audiowsinclimit (audiowsinclimit);
334 }
335
336 GST_END_TEST;
337
338 /* Test if buffers smaller than the kernel size are handled
339  * correctly without accessing wrong memory areas */
340 GST_START_TEST (test_32_small_buffer)
341 {
342   GstElement *audiowsinclimit;
343   GstBuffer *inbuffer, *outbuffer;
344   GstCaps *caps;
345   gfloat *in;
346   gint i;
347
348   audiowsinclimit = setup_audiowsinclimit ();
349   /* Set to lowpass */
350   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
351   g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL);
352
353   fail_unless (gst_element_set_state (audiowsinclimit,
354           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
355       "could not set to playing");
356
357   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
358   inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gfloat));
359   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
360   in = (gfloat *) GST_BUFFER_DATA (inbuffer);
361   for (i = 0; i < 20; i++)
362     in[i] = 1.0;
363
364   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32);
365   gst_buffer_set_caps (inbuffer, caps);
366   gst_caps_unref (caps);
367   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
368
369   /* pushing gives away my reference ... */
370   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
371   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
372   /* ... and puts a new buffer on the global list */
373   fail_unless (g_list_length (buffers) >= 1);
374   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
375
376   /* cleanup */
377   cleanup_audiowsinclimit (audiowsinclimit);
378 }
379
380 GST_END_TEST;
381
382 /* Test if data containing only one frequency component
383  * at 0 is preserved with lowpass mode and a cutoff
384  * at rate/4 */
385 GST_START_TEST (test_64_lp_0hz)
386 {
387   GstElement *audiowsinclimit;
388   GstBuffer *inbuffer, *outbuffer;
389   GstCaps *caps;
390   gdouble *in, *res, rms;
391   gint i;
392   GList *node;
393
394   audiowsinclimit = setup_audiowsinclimit ();
395   /* Set to lowpass */
396   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
397   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
398
399   fail_unless (gst_element_set_state (audiowsinclimit,
400           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
401       "could not set to playing");
402
403   /* cutoff = sampling rate / 4, data = 0 */
404   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
405   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
406   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
407   in = (gdouble *) GST_BUFFER_DATA (inbuffer);
408   for (i = 0; i < 128; i++)
409     in[i] = 1.0;
410
411   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64);
412   gst_buffer_set_caps (inbuffer, caps);
413   gst_caps_unref (caps);
414   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
415
416   /* pushing gives away my reference ... */
417   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
418   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
419   /* ... and puts a new buffer on the global list */
420   fail_unless (g_list_length (buffers) >= 1);
421
422   for (node = buffers; node; node = node->next) {
423     gint buffer_length;
424
425     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
426
427     res = (gdouble *) GST_BUFFER_DATA (outbuffer);
428     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble);
429     rms = 0.0;
430     for (i = 0; i < buffer_length; i++)
431       rms += res[i] * res[i];
432     rms = sqrt (rms / buffer_length);
433     fail_unless (rms >= 0.9);
434   }
435
436   /* cleanup */
437   cleanup_audiowsinclimit (audiowsinclimit);
438 }
439
440 GST_END_TEST;
441
442 /* Test if data containing only one frequency component
443  * at rate/2 is erased with lowpass mode and a cutoff
444  * at rate/4 */
445 GST_START_TEST (test_64_lp_22050hz)
446 {
447   GstElement *audiowsinclimit;
448   GstBuffer *inbuffer, *outbuffer;
449   GstCaps *caps;
450   gdouble *in, *res, rms;
451   gint i;
452   GList *node;
453
454   audiowsinclimit = setup_audiowsinclimit ();
455   /* Set to lowpass */
456   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
457   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
458
459   fail_unless (gst_element_set_state (audiowsinclimit,
460           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
461       "could not set to playing");
462
463   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
464   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
465   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
466   in = (gdouble *) GST_BUFFER_DATA (inbuffer);
467   for (i = 0; i < 128; i += 2) {
468     in[i] = 1.0;
469     in[i + 1] = -1.0;
470   }
471
472   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64);
473   gst_buffer_set_caps (inbuffer, caps);
474   gst_caps_unref (caps);
475   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
476
477   /* pushing gives away my reference ... */
478   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
479   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
480   /* ... and puts a new buffer on the global list */
481   fail_unless (g_list_length (buffers) >= 1);
482
483   for (node = buffers; node; node = node->next) {
484     gint buffer_length;
485
486     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
487
488     res = (gdouble *) GST_BUFFER_DATA (outbuffer);
489     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble);
490     rms = 0.0;
491     for (i = 0; i < buffer_length; i++)
492       rms += res[i] * res[i];
493     rms = sqrt (rms / buffer_length);
494     fail_unless (rms <= 0.1);
495   }
496
497   /* cleanup */
498   cleanup_audiowsinclimit (audiowsinclimit);
499 }
500
501 GST_END_TEST;
502
503 /* Test if data containing only one frequency component
504  * at 0 is erased with highpass mode and a cutoff
505  * at rate/4 */
506 GST_START_TEST (test_64_hp_0hz)
507 {
508   GstElement *audiowsinclimit;
509   GstBuffer *inbuffer, *outbuffer;
510   GstCaps *caps;
511   gdouble *in, *res, rms;
512   gint i;
513   GList *node;
514
515   audiowsinclimit = setup_audiowsinclimit ();
516   /* Set to highpass */
517   g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL);
518   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
519
520   fail_unless (gst_element_set_state (audiowsinclimit,
521           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
522       "could not set to playing");
523
524   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
525   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
526   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
527   in = (gdouble *) GST_BUFFER_DATA (inbuffer);
528   for (i = 0; i < 128; i++)
529     in[i] = 1.0;
530
531   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64);
532   gst_buffer_set_caps (inbuffer, caps);
533   gst_caps_unref (caps);
534   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
535
536   /* pushing gives away my reference ... */
537   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
538   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
539   /* ... and puts a new buffer on the global list */
540   fail_unless (g_list_length (buffers) >= 1);
541
542   for (node = buffers; node; node = node->next) {
543     gint buffer_length;
544
545     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
546
547     res = (gdouble *) GST_BUFFER_DATA (outbuffer);
548     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble);
549     rms = 0.0;
550     for (i = 0; i < buffer_length; i++)
551       rms += res[i] * res[i];
552     rms = sqrt (rms / buffer_length);
553     fail_unless (rms <= 0.1);
554   }
555
556   /* cleanup */
557   cleanup_audiowsinclimit (audiowsinclimit);
558 }
559
560 GST_END_TEST;
561
562 /* Test if data containing only one frequency component
563  * at rate/2 is preserved with highpass mode and a cutoff
564  * at rate/4 */
565 GST_START_TEST (test_64_hp_22050hz)
566 {
567   GstElement *audiowsinclimit;
568   GstBuffer *inbuffer, *outbuffer;
569   GstCaps *caps;
570   gdouble *in, *res, rms;
571   gint i;
572   GList *node;
573
574   audiowsinclimit = setup_audiowsinclimit ();
575   /* Set to highpass */
576   g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL);
577   g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL);
578
579   fail_unless (gst_element_set_state (audiowsinclimit,
580           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
581       "could not set to playing");
582
583   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
584   inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
585   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
586   in = (gdouble *) GST_BUFFER_DATA (inbuffer);
587   for (i = 0; i < 128; i += 2) {
588     in[i] = 1.0;
589     in[i + 1] = -1.0;
590   }
591
592   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64);
593   gst_buffer_set_caps (inbuffer, caps);
594   gst_caps_unref (caps);
595   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
596
597   /* pushing gives away my reference ... */
598   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
599   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
600   /* ... and puts a new buffer on the global list */
601   fail_unless (g_list_length (buffers) >= 1);
602   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
603
604   for (node = buffers; node; node = node->next) {
605     gint buffer_length;
606
607     fail_if ((outbuffer = (GstBuffer *) node->data) == NULL);
608
609     res = (gdouble *) GST_BUFFER_DATA (outbuffer);
610     buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble);
611     rms = 0.0;
612     for (i = 0; i < buffer_length; i++)
613       rms += res[i] * res[i];
614     rms = sqrt (rms / buffer_length);
615     fail_unless (rms >= 0.9);
616   }
617
618   /* cleanup */
619   cleanup_audiowsinclimit (audiowsinclimit);
620 }
621
622 GST_END_TEST;
623
624 /* Test if buffers smaller than the kernel size are handled
625  * correctly without accessing wrong memory areas */
626 GST_START_TEST (test_64_small_buffer)
627 {
628   GstElement *audiowsinclimit;
629   GstBuffer *inbuffer, *outbuffer;
630   GstCaps *caps;
631   gdouble *in;
632   gint i;
633
634   audiowsinclimit = setup_audiowsinclimit ();
635   /* Set to lowpass */
636   g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL);
637   g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL);
638
639   fail_unless (gst_element_set_state (audiowsinclimit,
640           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
641       "could not set to playing");
642
643   g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL);
644   inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble));
645   GST_BUFFER_TIMESTAMP (inbuffer) = 0;
646   in = (gdouble *) GST_BUFFER_DATA (inbuffer);
647   for (i = 0; i < 20; i++)
648     in[i] = 1.0;
649
650   caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64);
651   gst_buffer_set_caps (inbuffer, caps);
652   gst_caps_unref (caps);
653   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
654
655   /* pushing gives away my reference ... */
656   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
657   fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
658   /* ... and puts a new buffer on the global list */
659   fail_unless (g_list_length (buffers) >= 1);
660   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
661
662   /* cleanup */
663   cleanup_audiowsinclimit (audiowsinclimit);
664 }
665
666 GST_END_TEST;
667
668 static Suite *
669 audiowsinclimit_suite (void)
670 {
671   Suite *s = suite_create ("audiowsinclimit");
672   TCase *tc_chain = tcase_create ("general");
673
674   suite_add_tcase (s, tc_chain);
675   tcase_add_test (tc_chain, test_32_lp_0hz);
676   tcase_add_test (tc_chain, test_32_lp_22050hz);
677   tcase_add_test (tc_chain, test_32_hp_0hz);
678   tcase_add_test (tc_chain, test_32_hp_22050hz);
679   tcase_add_test (tc_chain, test_32_small_buffer);
680   tcase_add_test (tc_chain, test_64_lp_0hz);
681   tcase_add_test (tc_chain, test_64_lp_22050hz);
682   tcase_add_test (tc_chain, test_64_hp_0hz);
683   tcase_add_test (tc_chain, test_64_hp_22050hz);
684   tcase_add_test (tc_chain, test_64_small_buffer);
685
686   return s;
687 }
688
689 int
690 main (int argc, char **argv)
691 {
692   int nf;
693
694   Suite *s = audiowsinclimit_suite ();
695   SRunner *sr = srunner_create (s);
696
697   gst_check_init (&argc, &argv);
698
699   srunner_run_all (sr, CK_NORMAL);
700   nf = srunner_ntests_failed (sr);
701   srunner_free (sr);
702
703   return nf;
704 }