3b073c78334a751683b15ed57ee5114287017b76
[platform/upstream/gst-plugins-good.git] / tests / check / elements / audioamplify.c
1 /* GStreamer
2  *
3  * unit test for audioamplify
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 #include <gst/audio/audio.h>
31
32 gboolean have_eos = FALSE;
33
34 /* For ease of programming we use globals to keep refs for our floating
35  * src and sink pads we create; otherwise we always have to do get_pad,
36  * get_peer, and then remove references in every test function */
37 GstPad *mysrcpad, *mysinkpad;
38
39
40 #define AMPLIFY_CAPS_STRING    \
41     "audio/x-raw, "                     \
42     "channels = (int) 1, "              \
43     "rate = (int) 44100, "              \
44     "layout = (string) interleaved, "   \
45     "format = (string) " GST_AUDIO_NE(S16)
46
47 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
48     GST_PAD_SINK,
49     GST_PAD_ALWAYS,
50     GST_STATIC_CAPS ("audio/x-raw, "
51         "channels = (int) 1, "
52         "rate = (int) [ 1,  MAX ], "
53         "layout = (string) interleaved, "
54         "format = (string) " GST_AUDIO_NE (S16)));
55 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
56     GST_PAD_SRC,
57     GST_PAD_ALWAYS,
58     GST_STATIC_CAPS ("audio/x-raw, "
59         "channels = (int) 1, "
60         "rate = (int) [ 1,  MAX ], "
61         "layout = (string) interleaved, "
62         "format = (string) " GST_AUDIO_NE (S16)));
63
64 static GstElement *
65 setup_amplify (void)
66 {
67   GstElement *amplify;
68
69   GST_DEBUG ("setup_amplify");
70   amplify = gst_check_setup_element ("audioamplify");
71   mysrcpad = gst_check_setup_src_pad (amplify, &srctemplate);
72   mysinkpad = gst_check_setup_sink_pad (amplify, &sinktemplate);
73   gst_pad_set_active (mysrcpad, TRUE);
74   gst_pad_set_active (mysinkpad, TRUE);
75
76   return amplify;
77 }
78
79 static void
80 cleanup_amplify (GstElement * amplify)
81 {
82   GST_DEBUG ("cleanup_amplify");
83
84   g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
85   g_list_free (buffers);
86   buffers = NULL;
87
88   gst_pad_set_active (mysrcpad, FALSE);
89   gst_pad_set_active (mysinkpad, FALSE);
90   gst_check_teardown_src_pad (amplify);
91   gst_check_teardown_sink_pad (amplify);
92   gst_check_teardown_element (amplify);
93 }
94
95 GST_START_TEST (test_passthrough)
96 {
97   GstElement *amplify;
98   GstBuffer *inbuffer, *outbuffer;
99   GstCaps *caps;
100   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
101   gint16 res[6];
102
103   amplify = setup_amplify ();
104   fail_unless (gst_element_set_state (amplify,
105           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
106       "could not set to playing");
107
108   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
109   fail_unless (gst_pad_set_caps (mysrcpad, caps));
110   gst_caps_unref (caps);
111
112   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
113   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
114   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
115
116   /* pushing gives away my reference ... */
117   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
118   /* ... but it ends up being collected on the global buffer list */
119   fail_unless_equals_int (g_list_length (buffers), 1);
120   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
121
122   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
123   GST_INFO
124       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
125       in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3],
126       res[4], res[5]);
127   fail_unless (gst_buffer_memcmp (outbuffer, 0, in, 12) == 0);
128
129   /* cleanup */
130   cleanup_amplify (amplify);
131 }
132
133 GST_END_TEST;
134
135 GST_START_TEST (test_zero)
136 {
137   GstElement *amplify;
138   GstBuffer *inbuffer, *outbuffer;
139   GstCaps *caps;
140   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
141   gint16 out[6] = { 0, 0, 0, 0, 0, 0 };
142   gint16 res[6];
143
144   amplify = setup_amplify ();
145   g_object_set (G_OBJECT (amplify), "amplification", 0.0, NULL);
146   fail_unless (gst_element_set_state (amplify,
147           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
148       "could not set to playing");
149
150   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
151   fail_unless (gst_pad_set_caps (mysrcpad, caps));
152   gst_caps_unref (caps);
153
154   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
155   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
156   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
157
158   /* pushing gives away my reference ... */
159   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
160   /* ... and puts a new buffer on the global list */
161   fail_unless_equals_int (g_list_length (buffers), 1);
162   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
163
164   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
165   GST_INFO
166       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
167       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
168       res[3], res[4], res[5]);
169   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
170
171   /* cleanup */
172   cleanup_amplify (amplify);
173 }
174
175 GST_END_TEST;
176
177 GST_START_TEST (test_050_clip)
178 {
179   GstElement *amplify;
180   GstBuffer *inbuffer, *outbuffer;
181   GstCaps *caps;
182   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
183   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
184   gint16 res[6];
185
186   amplify = setup_amplify ();
187   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
188   fail_unless (gst_element_set_state (amplify,
189           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
190       "could not set to playing");
191
192   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
193   fail_unless (gst_pad_set_caps (mysrcpad, caps));
194   gst_caps_unref (caps);
195
196   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
197   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
198   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
199
200   /* pushing gives away my reference ... */
201   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
202   /* ... and puts a new buffer on the global list */
203   fail_unless_equals_int (g_list_length (buffers), 1);
204   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
205
206   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
207   GST_INFO
208       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
209       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
210       res[3], res[4], res[5]);
211   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
212
213   /* cleanup */
214   cleanup_amplify (amplify);
215 }
216
217 GST_END_TEST;
218
219 GST_START_TEST (test_200_clip)
220 {
221   GstElement *amplify;
222   GstBuffer *inbuffer, *outbuffer;
223   GstCaps *caps;
224   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
225   gint16 out[6] = { G_MAXINT16, -32768, 512, -256, 0, G_MININT16 };
226   gint16 res[6];
227
228   amplify = setup_amplify ();
229   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
230   fail_unless (gst_element_set_state (amplify,
231           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
232       "could not set to playing");
233
234   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
235   fail_unless (gst_pad_set_caps (mysrcpad, caps));
236   gst_caps_unref (caps);
237
238   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
239   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
240   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
241
242   /* pushing gives away my reference ... */
243   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
244   /* ... and puts a new buffer on the global list */
245   fail_unless_equals_int (g_list_length (buffers), 1);
246   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
247
248   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
249   GST_INFO
250       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
251       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
252       res[3], res[4], res[5]);
253   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
254
255   /* cleanup */
256   cleanup_amplify (amplify);
257 }
258
259 GST_END_TEST;
260
261 GST_START_TEST (test_050_wrap_negative)
262 {
263   GstElement *amplify;
264   GstBuffer *inbuffer, *outbuffer;
265   GstCaps *caps;
266   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
267   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
268   gint16 res[6];
269
270   amplify = setup_amplify ();
271   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
272   g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL);
273   fail_unless (gst_element_set_state (amplify,
274           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
275       "could not set to playing");
276
277   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
278   fail_unless (gst_pad_set_caps (mysrcpad, caps));
279   gst_caps_unref (caps);
280
281   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
282   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
283   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
284
285   /* pushing gives away my reference ... */
286   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
287   /* ... and puts a new buffer on the global list */
288   fail_unless_equals_int (g_list_length (buffers), 1);
289   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
290
291   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
292   GST_INFO
293       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
294       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
295       res[3], res[4], res[5]);
296   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
297
298   /* cleanup */
299   cleanup_amplify (amplify);
300 }
301
302 GST_END_TEST;
303
304 GST_START_TEST (test_200_wrap_negative)
305 {
306   GstElement *amplify;
307   GstBuffer *inbuffer, *outbuffer;
308   GstCaps *caps;
309   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
310   gint16 out[6] = { -16384, -32768, 512, -256, 0, 16384 };
311   gint16 res[6];
312
313   amplify = setup_amplify ();
314   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
315   g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL);
316   fail_unless (gst_element_set_state (amplify,
317           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
318       "could not set to playing");
319
320   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
321   fail_unless (gst_pad_set_caps (mysrcpad, caps));
322   gst_caps_unref (caps);
323
324   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
325   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
326   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
327
328   /* pushing gives away my reference ... */
329   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
330   /* ... and puts a new buffer on the global list */
331   fail_unless_equals_int (g_list_length (buffers), 1);
332   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
333
334   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
335   GST_INFO
336       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
337       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
338       res[3], res[4], res[5]);
339   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
340
341   /* cleanup */
342   cleanup_amplify (amplify);
343 }
344
345 GST_END_TEST;
346
347 GST_START_TEST (test_050_wrap_positive)
348 {
349   GstElement *amplify;
350   GstBuffer *inbuffer, *outbuffer;
351   GstCaps *caps;
352   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
353   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
354   gint16 res[6];
355
356   amplify = setup_amplify ();
357   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
358   g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL);
359   fail_unless (gst_element_set_state (amplify,
360           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
361       "could not set to playing");
362
363   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
364   fail_unless (gst_pad_set_caps (mysrcpad, caps));
365   gst_caps_unref (caps);
366
367   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
368   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
369   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
370
371   /* pushing gives away my reference ... */
372   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
373   /* ... and puts a new buffer on the global list */
374   fail_unless_equals_int (g_list_length (buffers), 1);
375   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
376
377   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
378   GST_INFO
379       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
380       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
381       res[3], res[4], res[5]);
382   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
383
384   /* cleanup */
385   cleanup_amplify (amplify);
386 }
387
388 GST_END_TEST;
389
390 GST_START_TEST (test_200_wrap_positive)
391 {
392   GstElement *amplify;
393   GstBuffer *inbuffer, *outbuffer;
394   GstCaps *caps;
395   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
396   gint16 out[6] = { 16382, -32768, 512, -256, 0, -16384 };
397   gint16 res[6];
398
399   amplify = setup_amplify ();
400   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
401   g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL);
402   fail_unless (gst_element_set_state (amplify,
403           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
404       "could not set to playing");
405
406   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
407   fail_unless (gst_pad_set_caps (mysrcpad, caps));
408   gst_caps_unref (caps);
409
410   inbuffer = gst_buffer_new_wrapped_full (in, NULL, 0, 12);
411   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
412   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
413
414   /* pushing gives away my reference ... */
415   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
416   /* ... and puts a new buffer on the global list */
417   fail_unless_equals_int (g_list_length (buffers), 1);
418   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
419
420   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
421   GST_INFO
422       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
423       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
424       res[3], res[4], res[5]);
425   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
426
427   /* cleanup */
428   cleanup_amplify (amplify);
429 }
430
431 GST_END_TEST;
432
433 static Suite *
434 amplify_suite (void)
435 {
436   Suite *s = suite_create ("amplify");
437   TCase *tc_chain = tcase_create ("general");
438
439   suite_add_tcase (s, tc_chain);
440   tcase_add_test (tc_chain, test_passthrough);
441   tcase_add_test (tc_chain, test_zero);
442   tcase_add_test (tc_chain, test_050_clip);
443   tcase_add_test (tc_chain, test_200_clip);
444   tcase_add_test (tc_chain, test_050_wrap_negative);
445   tcase_add_test (tc_chain, test_200_wrap_negative);
446   tcase_add_test (tc_chain, test_050_wrap_positive);
447   tcase_add_test (tc_chain, test_200_wrap_positive);
448   return s;
449 }
450
451 int
452 main (int argc, char **argv)
453 {
454   int nf;
455
456   Suite *s = amplify_suite ();
457   SRunner *sr = srunner_create (s);
458
459   gst_check_init (&argc, &argv);
460
461   srunner_run_all (sr, CK_NORMAL);
462   nf = srunner_ntests_failed (sr);
463   srunner_free (sr);
464
465   return nf;
466 }