Tizen 2.0 Release
[framework/multimedia/gst-plugins-good0.10.git] / tests / check / elements / audiodynamic.c
1 /* GStreamer
2  *
3  * unit test for audiodynamic
4  *
5  * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
6  *
7  * Greatly based on the audiopanorama unit test
8  * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public
21  * License along with this library; if not, write to the
22  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  */
25
26 #include <unistd.h>
27
28 #include <gst/base/gstbasetransform.h>
29 #include <gst/check/gstcheck.h>
30
31 gboolean have_eos = FALSE;
32
33 /* For ease of programming we use globals to keep refs for our floating
34  * src and sink pads we create; otherwise we always have to do get_pad,
35  * get_peer, and then remove references in every test function */
36 GstPad *mysrcpad, *mysinkpad;
37
38
39 #define DYNAMIC_CAPS_STRING    \
40     "audio/x-raw-int, "                 \
41     "channels = (int) 1, "              \
42     "rate = (int) 44100, "              \
43     "endianness = (int) BYTE_ORDER, "   \
44     "width = (int) 16, "                \
45     "depth = (int) 16, "                \
46     "signed = (bool) TRUE"
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-int, "
52         "channels = (int) 1, "
53         "rate = (int) [ 1,  MAX ], "
54         "endianness = (int) BYTE_ORDER, "
55         "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")
56     );
57 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
58     GST_PAD_SRC,
59     GST_PAD_ALWAYS,
60     GST_STATIC_CAPS ("audio/x-raw-int, "
61         "channels = (int) 1, "
62         "rate = (int) [ 1,  MAX ], "
63         "endianness = (int) BYTE_ORDER, "
64         "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")
65     );
66
67 static GstElement *
68 setup_dynamic (void)
69 {
70   GstElement *dynamic;
71
72   GST_DEBUG ("setup_dynamic");
73   dynamic = gst_check_setup_element ("audiodynamic");
74   mysrcpad = gst_check_setup_src_pad (dynamic, &srctemplate, NULL);
75   mysinkpad = gst_check_setup_sink_pad (dynamic, &sinktemplate, NULL);
76   gst_pad_set_active (mysrcpad, TRUE);
77   gst_pad_set_active (mysinkpad, TRUE);
78
79   return dynamic;
80 }
81
82 static void
83 cleanup_dynamic (GstElement * dynamic)
84 {
85   GST_DEBUG ("cleanup_dynamic");
86
87   g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
88   g_list_free (buffers);
89   buffers = NULL;
90
91   gst_pad_set_active (mysrcpad, FALSE);
92   gst_pad_set_active (mysinkpad, FALSE);
93   gst_check_teardown_src_pad (dynamic);
94   gst_check_teardown_sink_pad (dynamic);
95   gst_check_teardown_element (dynamic);
96 }
97
98 GST_START_TEST (test_passthrough)
99 {
100   GstElement *dynamic;
101   GstBuffer *inbuffer, *outbuffer;
102   GstCaps *caps;
103   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
104   gint16 *res;
105
106   dynamic = setup_dynamic ();
107   fail_unless (gst_element_set_state (dynamic,
108           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
109       "could not set to playing");
110
111   inbuffer = gst_buffer_new_and_alloc (12);
112   memcpy (GST_BUFFER_DATA (inbuffer), in, 12);
113   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0);
114   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
115   gst_buffer_set_caps (inbuffer, caps);
116   gst_caps_unref (caps);
117   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
118
119   /* pushing gives away my reference ... */
120   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
121   /* ... but it ends up being collected on the global buffer list */
122   fail_unless_equals_int (g_list_length (buffers), 1);
123   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
124
125   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
126   GST_INFO
127       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
128       in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3],
129       res[4], res[5]);
130   fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 12) == 0);
131
132   /* cleanup */
133   cleanup_dynamic (dynamic);
134 }
135
136 GST_END_TEST;
137
138 GST_START_TEST (test_compress_hard_50_50)
139 {
140   GstElement *dynamic;
141   GstBuffer *inbuffer, *outbuffer;
142   GstCaps *caps;
143   gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 };
144   gint16 *res;
145
146   dynamic = setup_dynamic ();
147   g_object_set (G_OBJECT (dynamic), "mode", 0, NULL);
148   g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL);
149   g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL);
150   g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL);
151   fail_unless (gst_element_set_state (dynamic,
152           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
153       "could not set to playing");
154
155   inbuffer = gst_buffer_new_and_alloc (16);
156   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
157   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
158   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
159   gst_buffer_set_caps (inbuffer, caps);
160   gst_caps_unref (caps);
161   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
162
163   /* pushing gives away my reference ... */
164   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
165   /* ... and puts a new buffer on the global list */
166   fail_unless_equals_int (g_list_length (buffers), 1);
167   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
168
169   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
170
171   fail_unless (res[0] > in[0]);
172   fail_unless (res[1] < in[1]);
173   fail_unless (res[2] == in[2]);
174   fail_unless (res[3] == in[3]);
175   fail_unless (res[4] == in[4]);
176   fail_unless (res[5] == in[5]);
177   fail_unless (res[6] > in[6]);
178   fail_unless (res[7] < in[7]);
179
180   /* cleanup */
181   cleanup_dynamic (dynamic);
182 }
183
184 GST_END_TEST;
185
186 GST_START_TEST (test_compress_soft_50_50)
187 {
188   GstElement *dynamic;
189   GstBuffer *inbuffer, *outbuffer;
190   GstCaps *caps;
191   gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 };
192   gint16 *res;
193
194   dynamic = setup_dynamic ();
195   g_object_set (G_OBJECT (dynamic), "mode", 0, NULL);
196   g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL);
197   g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL);
198   g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL);
199   fail_unless (gst_element_set_state (dynamic,
200           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
201       "could not set to playing");
202
203   inbuffer = gst_buffer_new_and_alloc (16);
204   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
205   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
206   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
207   gst_buffer_set_caps (inbuffer, caps);
208   gst_caps_unref (caps);
209   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
210
211   /* pushing gives away my reference ... */
212   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
213   /* ... and puts a new buffer on the global list */
214   fail_unless_equals_int (g_list_length (buffers), 1);
215   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
216
217   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
218
219   fail_unless (res[0] > in[0]);
220   fail_unless (res[1] < in[1]);
221   fail_unless (res[2] == in[2]);
222   fail_unless (res[3] == in[3]);
223   fail_unless (res[4] == in[4]);
224   fail_unless (res[5] == in[5]);
225   fail_unless (res[6] > in[6]);
226   fail_unless (res[7] < in[7]);
227
228   /* cleanup */
229   cleanup_dynamic (dynamic);
230 }
231
232 GST_END_TEST;
233
234 GST_START_TEST (test_compress_hard_100_50)
235 {
236   GstElement *dynamic;
237   GstBuffer *inbuffer, *outbuffer;
238   GstCaps *caps;
239   gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 };
240   gint16 *res;
241
242   dynamic = setup_dynamic ();
243   g_object_set (G_OBJECT (dynamic), "mode", 0, NULL);
244   g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL);
245   g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL);
246   g_object_set (G_OBJECT (dynamic), "threshold", 1.0, NULL);
247   fail_unless (gst_element_set_state (dynamic,
248           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
249       "could not set to playing");
250
251   inbuffer = gst_buffer_new_and_alloc (16);
252   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
253   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
254   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
255   gst_buffer_set_caps (inbuffer, caps);
256   gst_caps_unref (caps);
257   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
258
259   /* pushing gives away my reference ... */
260   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
261   /* ... and puts a new buffer on the global list */
262   fail_unless_equals_int (g_list_length (buffers), 1);
263   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
264
265   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
266
267   fail_unless (res[0] == in[0]);
268   fail_unless (res[1] == in[1]);
269   fail_unless (res[2] == in[2]);
270   fail_unless (res[3] == in[3]);
271   fail_unless (res[4] == in[4]);
272   fail_unless (res[5] == in[5]);
273   fail_unless (res[6] == in[6]);
274   fail_unless (res[7] == in[7]);
275
276   /* cleanup */
277   cleanup_dynamic (dynamic);
278 }
279
280 GST_END_TEST;
281
282
283 GST_START_TEST (test_expand_hard_50_200)
284 {
285   GstElement *dynamic;
286   GstBuffer *inbuffer, *outbuffer;
287   GstCaps *caps;
288   gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 };
289   gint16 *res;
290
291   dynamic = setup_dynamic ();
292   g_object_set (G_OBJECT (dynamic), "mode", 1, NULL);
293   g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL);
294   g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL);
295   g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL);
296   fail_unless (gst_element_set_state (dynamic,
297           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
298       "could not set to playing");
299
300   inbuffer = gst_buffer_new_and_alloc (16);
301   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
302   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
303   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
304   gst_buffer_set_caps (inbuffer, caps);
305   gst_caps_unref (caps);
306   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
307
308   /* pushing gives away my reference ... */
309   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
310   /* ... and puts a new buffer on the global list */
311   fail_unless_equals_int (g_list_length (buffers), 1);
312   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
313
314   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
315
316   fail_unless (res[0] == in[0]);
317   fail_unless (res[1] == in[1]);
318   fail_unless (res[2] > in[2]);
319   fail_unless (res[3] < in[3]);
320   fail_unless (res[4] > in[4]);
321   fail_unless (res[5] == in[5]);
322   fail_unless (res[6] == in[6]);
323   fail_unless (res[7] == in[7]);
324
325   /* cleanup */
326   cleanup_dynamic (dynamic);
327 }
328
329 GST_END_TEST;
330
331 GST_START_TEST (test_expand_soft_50_200)
332 {
333   GstElement *dynamic;
334   GstBuffer *inbuffer, *outbuffer;
335   GstCaps *caps;
336   gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 };
337   gint16 *res;
338
339   dynamic = setup_dynamic ();
340   g_object_set (G_OBJECT (dynamic), "mode", 1, NULL);
341   g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL);
342   g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL);
343   g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL);
344   fail_unless (gst_element_set_state (dynamic,
345           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
346       "could not set to playing");
347
348   inbuffer = gst_buffer_new_and_alloc (16);
349   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
350   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
351   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
352   gst_buffer_set_caps (inbuffer, caps);
353   gst_caps_unref (caps);
354   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
355
356   /* pushing gives away my reference ... */
357   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
358   /* ... and puts a new buffer on the global list */
359   fail_unless_equals_int (g_list_length (buffers), 1);
360   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
361
362   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
363
364   fail_unless (res[0] == in[0]);
365   fail_unless (res[1] == in[1]);
366   fail_unless (res[2] > in[2]);
367   fail_unless (res[3] < in[3]);
368   fail_unless (res[4] > in[4]);
369   fail_unless (res[5] == in[5]);
370   fail_unless (res[6] == in[6]);
371   fail_unless (res[7] == in[7]);
372
373   /* cleanup */
374   cleanup_dynamic (dynamic);
375 }
376
377 GST_END_TEST;
378
379 GST_START_TEST (test_expand_hard_0_200)
380 {
381   GstElement *dynamic;
382   GstBuffer *inbuffer, *outbuffer;
383   GstCaps *caps;
384   gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 };
385   gint16 *res;
386
387   dynamic = setup_dynamic ();
388   g_object_set (G_OBJECT (dynamic), "mode", 1, NULL);
389   g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL);
390   g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL);
391   g_object_set (G_OBJECT (dynamic), "threshold", 0.0, NULL);
392   fail_unless (gst_element_set_state (dynamic,
393           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
394       "could not set to playing");
395
396   inbuffer = gst_buffer_new_and_alloc (16);
397   memcpy (GST_BUFFER_DATA (inbuffer), in, 16);
398   fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0);
399   caps = gst_caps_from_string (DYNAMIC_CAPS_STRING);
400   gst_buffer_set_caps (inbuffer, caps);
401   gst_caps_unref (caps);
402   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
403
404   /* pushing gives away my reference ... */
405   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
406   /* ... and puts a new buffer on the global list */
407   fail_unless_equals_int (g_list_length (buffers), 1);
408   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
409
410   res = (gint16 *) GST_BUFFER_DATA (outbuffer);
411
412   fail_unless (res[0] == in[0]);
413   fail_unless (res[1] == in[1]);
414   fail_unless (res[2] == in[2]);
415   fail_unless (res[3] == in[3]);
416   fail_unless (res[4] == in[4]);
417   fail_unless (res[5] == in[5]);
418   fail_unless (res[6] == in[6]);
419   fail_unless (res[7] == in[7]);
420
421   /* cleanup */
422   cleanup_dynamic (dynamic);
423 }
424
425 GST_END_TEST;
426
427 static Suite *
428 dynamic_suite (void)
429 {
430   Suite *s = suite_create ("dynamic");
431   TCase *tc_chain = tcase_create ("general");
432
433   suite_add_tcase (s, tc_chain);
434   tcase_add_test (tc_chain, test_passthrough);
435   tcase_add_test (tc_chain, test_compress_hard_50_50);
436   tcase_add_test (tc_chain, test_compress_soft_50_50);
437   tcase_add_test (tc_chain, test_compress_hard_100_50);
438   tcase_add_test (tc_chain, test_expand_hard_50_200);
439   tcase_add_test (tc_chain, test_expand_soft_50_200);
440   tcase_add_test (tc_chain, test_expand_hard_0_200);
441   return s;
442 }
443
444 int
445 main (int argc, char **argv)
446 {
447   int nf;
448
449   Suite *s = dynamic_suite ();
450   SRunner *sr = srunner_create (s);
451
452   gst_check_init (&argc, &argv);
453
454   srunner_run_all (sr, CK_NORMAL);
455   nf = srunner_ntests_failed (sr);
456   srunner_free (sr);
457
458   return nf;
459 }