tests: update for memory api changes
[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 =
113       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
114       NULL, NULL);
115   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
116   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
117
118   /* pushing gives away my reference ... */
119   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
120   /* ... but it ends up being collected on the global buffer list */
121   fail_unless_equals_int (g_list_length (buffers), 1);
122   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
123
124   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
125   GST_INFO
126       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
127       in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3],
128       res[4], res[5]);
129   fail_unless (gst_buffer_memcmp (outbuffer, 0, in, 12) == 0);
130
131   /* cleanup */
132   cleanup_amplify (amplify);
133 }
134
135 GST_END_TEST;
136
137 GST_START_TEST (test_zero)
138 {
139   GstElement *amplify;
140   GstBuffer *inbuffer, *outbuffer;
141   GstCaps *caps;
142   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
143   gint16 out[6] = { 0, 0, 0, 0, 0, 0 };
144   gint16 res[6];
145
146   amplify = setup_amplify ();
147   g_object_set (G_OBJECT (amplify), "amplification", 0.0, NULL);
148   fail_unless (gst_element_set_state (amplify,
149           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
150       "could not set to playing");
151
152   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
153   fail_unless (gst_pad_set_caps (mysrcpad, caps));
154   gst_caps_unref (caps);
155
156   inbuffer =
157       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
158       NULL, NULL);
159   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
160   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
161
162   /* pushing gives away my reference ... */
163   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
164   /* ... and puts a new buffer on the global list */
165   fail_unless_equals_int (g_list_length (buffers), 1);
166   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
167
168   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
169   GST_INFO
170       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
171       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
172       res[3], res[4], res[5]);
173   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
174
175   /* cleanup */
176   cleanup_amplify (amplify);
177 }
178
179 GST_END_TEST;
180
181 GST_START_TEST (test_050_clip)
182 {
183   GstElement *amplify;
184   GstBuffer *inbuffer, *outbuffer;
185   GstCaps *caps;
186   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
187   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
188   gint16 res[6];
189
190   amplify = setup_amplify ();
191   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
192   fail_unless (gst_element_set_state (amplify,
193           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
194       "could not set to playing");
195
196   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
197   fail_unless (gst_pad_set_caps (mysrcpad, caps));
198   gst_caps_unref (caps);
199
200   inbuffer =
201       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
202       NULL, NULL);
203   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
204   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
205
206   /* pushing gives away my reference ... */
207   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
208   /* ... and puts a new buffer on the global list */
209   fail_unless_equals_int (g_list_length (buffers), 1);
210   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
211
212   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
213   GST_INFO
214       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
215       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
216       res[3], res[4], res[5]);
217   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
218
219   /* cleanup */
220   cleanup_amplify (amplify);
221 }
222
223 GST_END_TEST;
224
225 GST_START_TEST (test_200_clip)
226 {
227   GstElement *amplify;
228   GstBuffer *inbuffer, *outbuffer;
229   GstCaps *caps;
230   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
231   gint16 out[6] = { G_MAXINT16, -32768, 512, -256, 0, G_MININT16 };
232   gint16 res[6];
233
234   amplify = setup_amplify ();
235   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
236   fail_unless (gst_element_set_state (amplify,
237           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
238       "could not set to playing");
239
240   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
241   fail_unless (gst_pad_set_caps (mysrcpad, caps));
242   gst_caps_unref (caps);
243
244   inbuffer =
245       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
246       NULL, NULL);
247   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
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   /* ... and puts a new buffer on the global list */
253   fail_unless_equals_int (g_list_length (buffers), 1);
254   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
255
256   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
257   GST_INFO
258       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
259       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
260       res[3], res[4], res[5]);
261   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
262
263   /* cleanup */
264   cleanup_amplify (amplify);
265 }
266
267 GST_END_TEST;
268
269 GST_START_TEST (test_050_wrap_negative)
270 {
271   GstElement *amplify;
272   GstBuffer *inbuffer, *outbuffer;
273   GstCaps *caps;
274   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
275   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
276   gint16 res[6];
277
278   amplify = setup_amplify ();
279   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
280   g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL);
281   fail_unless (gst_element_set_state (amplify,
282           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
283       "could not set to playing");
284
285   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
286   fail_unless (gst_pad_set_caps (mysrcpad, caps));
287   gst_caps_unref (caps);
288
289   inbuffer =
290       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
291       NULL, NULL);
292   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
293   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
294
295   /* pushing gives away my reference ... */
296   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
297   /* ... and puts a new buffer on the global list */
298   fail_unless_equals_int (g_list_length (buffers), 1);
299   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
300
301   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
302   GST_INFO
303       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
304       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
305       res[3], res[4], res[5]);
306   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
307
308   /* cleanup */
309   cleanup_amplify (amplify);
310 }
311
312 GST_END_TEST;
313
314 GST_START_TEST (test_200_wrap_negative)
315 {
316   GstElement *amplify;
317   GstBuffer *inbuffer, *outbuffer;
318   GstCaps *caps;
319   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
320   gint16 out[6] = { -16384, -32768, 512, -256, 0, 16384 };
321   gint16 res[6];
322
323   amplify = setup_amplify ();
324   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
325   g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL);
326   fail_unless (gst_element_set_state (amplify,
327           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
328       "could not set to playing");
329
330   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
331   fail_unless (gst_pad_set_caps (mysrcpad, caps));
332   gst_caps_unref (caps);
333
334   inbuffer =
335       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
336       NULL, NULL);
337   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
338   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
339
340   /* pushing gives away my reference ... */
341   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
342   /* ... and puts a new buffer on the global list */
343   fail_unless_equals_int (g_list_length (buffers), 1);
344   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
345
346   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
347   GST_INFO
348       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
349       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
350       res[3], res[4], res[5]);
351   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
352
353   /* cleanup */
354   cleanup_amplify (amplify);
355 }
356
357 GST_END_TEST;
358
359 GST_START_TEST (test_050_wrap_positive)
360 {
361   GstElement *amplify;
362   GstBuffer *inbuffer, *outbuffer;
363   GstCaps *caps;
364   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
365   gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 };
366   gint16 res[6];
367
368   amplify = setup_amplify ();
369   g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL);
370   g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL);
371   fail_unless (gst_element_set_state (amplify,
372           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
373       "could not set to playing");
374
375   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
376   fail_unless (gst_pad_set_caps (mysrcpad, caps));
377   gst_caps_unref (caps);
378
379   inbuffer =
380       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
381       NULL, NULL);
382   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
383   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
384
385   /* pushing gives away my reference ... */
386   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
387   /* ... and puts a new buffer on the global list */
388   fail_unless_equals_int (g_list_length (buffers), 1);
389   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
390
391   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
392   GST_INFO
393       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
394       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
395       res[3], res[4], res[5]);
396   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
397
398   /* cleanup */
399   cleanup_amplify (amplify);
400 }
401
402 GST_END_TEST;
403
404 GST_START_TEST (test_200_wrap_positive)
405 {
406   GstElement *amplify;
407   GstBuffer *inbuffer, *outbuffer;
408   GstCaps *caps;
409   gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 };
410   gint16 out[6] = { 16382, -32768, 512, -256, 0, -16384 };
411   gint16 res[6];
412
413   amplify = setup_amplify ();
414   g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL);
415   g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL);
416   fail_unless (gst_element_set_state (amplify,
417           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
418       "could not set to playing");
419
420   caps = gst_caps_from_string (AMPLIFY_CAPS_STRING);
421   fail_unless (gst_pad_set_caps (mysrcpad, caps));
422   gst_caps_unref (caps);
423
424   inbuffer =
425       gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, 12, 0, 12,
426       NULL, NULL);
427   fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 12) == 0);
428   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
429
430   /* pushing gives away my reference ... */
431   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
432   /* ... and puts a new buffer on the global list */
433   fail_unless_equals_int (g_list_length (buffers), 1);
434   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
435
436   fail_unless (gst_buffer_extract (outbuffer, 0, res, 12) == 12);
437   GST_INFO
438       ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d",
439       out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2],
440       res[3], res[4], res[5]);
441   fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 12) == 0);
442
443   /* cleanup */
444   cleanup_amplify (amplify);
445 }
446
447 GST_END_TEST;
448
449 static Suite *
450 amplify_suite (void)
451 {
452   Suite *s = suite_create ("amplify");
453   TCase *tc_chain = tcase_create ("general");
454
455   suite_add_tcase (s, tc_chain);
456   tcase_add_test (tc_chain, test_passthrough);
457   tcase_add_test (tc_chain, test_zero);
458   tcase_add_test (tc_chain, test_050_clip);
459   tcase_add_test (tc_chain, test_200_clip);
460   tcase_add_test (tc_chain, test_050_wrap_negative);
461   tcase_add_test (tc_chain, test_200_wrap_negative);
462   tcase_add_test (tc_chain, test_050_wrap_positive);
463   tcase_add_test (tc_chain, test_200_wrap_positive);
464   return s;
465 }
466
467 int
468 main (int argc, char **argv)
469 {
470   int nf;
471
472   Suite *s = amplify_suite ();
473   SRunner *sr = srunner_create (s);
474
475   gst_check_init (&argc, &argv);
476
477   srunner_run_all (sr, CK_NORMAL);
478   nf = srunner_ntests_failed (sr);
479   srunner_free (sr);
480
481   return nf;
482 }