3 * unit test for audioamplify
5 * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
7 * Greatly based on the audiopanorama unit test
8 * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
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.
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.
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.
28 #include <gst/base/gstbasetransform.h>
29 #include <gst/check/gstcheck.h>
30 #include <gst/audio/audio.h>
32 gboolean have_eos = FALSE;
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;
40 #define AMPLIFY_CAPS_STRING \
42 "channels = (int) 1, " \
43 "rate = (int) 44100, " \
44 "layout = (string) interleaved, " \
45 "format = (string) " GST_AUDIO_NE(S16)
47 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
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",
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)));
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);
80 cleanup_amplify (GstElement * amplify)
82 GST_DEBUG ("cleanup_amplify");
84 g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
85 g_list_free (buffers);
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);
95 GST_START_TEST (test_passthrough)
98 GstBuffer *inbuffer, *outbuffer;
100 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
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");
108 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
109 fail_unless (gst_pad_set_caps (mysrcpad, caps));
110 gst_caps_unref (caps);
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);
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);
122 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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],
127 fail_unless (gst_buffer_memcmp (outbuffer, 0, in, 12) == 0);
130 cleanup_amplify (amplify);
135 GST_START_TEST (test_zero)
138 GstBuffer *inbuffer, *outbuffer;
140 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
141 gint16 out[6] = { 0, 0, 0, 0, 0, 0 };
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");
150 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
151 fail_unless (gst_pad_set_caps (mysrcpad, caps));
152 gst_caps_unref (caps);
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);
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);
164 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
172 cleanup_amplify (amplify);
177 GST_START_TEST (test_050_clip)
180 GstBuffer *inbuffer, *outbuffer;
182 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
183 gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
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");
192 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
193 fail_unless (gst_pad_set_caps (mysrcpad, caps));
194 gst_caps_unref (caps);
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);
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);
206 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
214 cleanup_amplify (amplify);
219 GST_START_TEST (test_200_clip)
222 GstBuffer *inbuffer, *outbuffer;
224 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
225 gint16 out[6] = { G_MAXINT16, -32768, 512, -256, 0, G_MININT16 };
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");
234 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
235 fail_unless (gst_pad_set_caps (mysrcpad, caps));
236 gst_caps_unref (caps);
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);
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);
248 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
256 cleanup_amplify (amplify);
261 GST_START_TEST (test_050_wrap_negative)
264 GstBuffer *inbuffer, *outbuffer;
266 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
267 gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
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");
277 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
278 fail_unless (gst_pad_set_caps (mysrcpad, caps));
279 gst_caps_unref (caps);
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);
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);
291 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
299 cleanup_amplify (amplify);
304 GST_START_TEST (test_200_wrap_negative)
307 GstBuffer *inbuffer, *outbuffer;
309 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
310 gint16 out[6] = { -16384, -32768, 512, -256, 0, 16384 };
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");
320 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
321 fail_unless (gst_pad_set_caps (mysrcpad, caps));
322 gst_caps_unref (caps);
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);
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);
334 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
342 cleanup_amplify (amplify);
347 GST_START_TEST (test_050_wrap_positive)
350 GstBuffer *inbuffer, *outbuffer;
352 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
353 gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
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");
363 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
364 fail_unless (gst_pad_set_caps (mysrcpad, caps));
365 gst_caps_unref (caps);
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);
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);
377 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
385 cleanup_amplify (amplify);
390 GST_START_TEST (test_200_wrap_positive)
393 GstBuffer *inbuffer, *outbuffer;
395 gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
396 gint16 out[6] = { 16382, -32768, 512, -256, 0, -16384 };
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");
406 caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
407 fail_unless (gst_pad_set_caps (mysrcpad, caps));
408 gst_caps_unref (caps);
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);
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);
420 fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
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);
428 cleanup_amplify (amplify);
436 Suite *s = suite_create ("amplify");
437 TCase *tc_chain = tcase_create ("general");
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);
452 main (int argc, char **argv)
456 Suite *s = amplify_suite ();
457 SRunner *sr = srunner_create (s);
459 gst_check_init (&argc, &argv);
461 srunner_run_all (sr, CK_NORMAL);
462 nf = srunner_ntests_failed (sr);