make %u in all request pad templates
[platform/upstream/gst-plugins-good.git] / tests / check / elements / interleave.c
1 /* GStreamer unit tests for the interleave element
2  * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
3  * Copyright (C) 2008 Sebastian Dröge <slomo@circular-chaos.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 # include "config.h"
23 #endif
24
25 #include <gst/check/gstcheck.h>
26 #include <gst/audio/multichannel.h>
27
28 GST_START_TEST (test_create_and_unref)
29 {
30   GstElement *interleave;
31
32   interleave = gst_element_factory_make ("interleave", NULL);
33   fail_unless (interleave != NULL);
34
35   gst_element_set_state (interleave, GST_STATE_NULL);
36   gst_object_unref (interleave);
37 }
38
39 GST_END_TEST;
40
41 GST_START_TEST (test_request_pads)
42 {
43   GstElement *interleave;
44   GstPad *pad1, *pad2;
45
46   interleave = gst_element_factory_make ("interleave", NULL);
47   fail_unless (interleave != NULL);
48
49   pad1 = gst_element_get_request_pad (interleave, "sink_%u");
50   fail_unless (pad1 != NULL);
51   fail_unless_equals_string (GST_OBJECT_NAME (pad1), "sink_0");
52
53   pad2 = gst_element_get_request_pad (interleave, "sink_%u");
54   fail_unless (pad2 != NULL);
55   fail_unless_equals_string (GST_OBJECT_NAME (pad2), "sink_1");
56
57   gst_element_release_request_pad (interleave, pad2);
58   gst_object_unref (pad2);
59   gst_element_release_request_pad (interleave, pad1);
60   gst_object_unref (pad1);
61
62   gst_element_set_state (interleave, GST_STATE_NULL);
63   gst_object_unref (interleave);
64 }
65
66 GST_END_TEST;
67
68 static GstPad **mysrcpads, *mysinkpad;
69 static GstBus *bus;
70 static GstElement *interleave;
71 static gint have_data;
72 static gfloat input[2];
73
74 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
75     GST_PAD_SINK,
76     GST_PAD_ALWAYS,
77     GST_STATIC_CAPS ("audio/x-raw-float, "
78         "width = (int) 32, "
79         "channels = (int) 2, "
80         "rate = (int) 48000, " "endianness = (int) BYTE_ORDER"));
81
82 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
83     GST_PAD_SRC,
84     GST_PAD_ALWAYS,
85     GST_STATIC_CAPS ("audio/x-raw-float, "
86         "width = (int) 32, "
87         "channels = (int) 1, "
88         "rate = (int) 48000, " "endianness = (int) BYTE_ORDER"));
89
90 #define CAPS_48khz \
91          "audio/x-raw-float, " \
92         "width = (int) 32, " \
93         "channels = (int) 1, " \
94         "rate = (int) 48000, " \
95         "endianness = (int) BYTE_ORDER"
96
97 static GstFlowReturn
98 interleave_chain_func (GstPad * pad, GstBuffer * buffer)
99 {
100   gfloat *outdata;
101   gint i;
102
103   fail_unless (GST_IS_BUFFER (buffer));
104   fail_unless_equals_int (GST_BUFFER_SIZE (buffer),
105       48000 * 2 * sizeof (gfloat));
106   fail_unless (GST_BUFFER_DATA (buffer) != NULL);
107
108   outdata = (gfloat *) GST_BUFFER_DATA (buffer);
109
110   for (i = 0; i < 48000 * 2; i += 2) {
111     fail_unless_equals_float (outdata[i], input[0]);
112     fail_unless_equals_float (outdata[i + 1], input[1]);
113   }
114
115   have_data++;
116
117   gst_buffer_unref (buffer);
118
119   return GST_FLOW_OK;
120 }
121
122 GST_START_TEST (test_interleave_2ch)
123 {
124   GstElement *queue;
125   GstPad *sink0, *sink1, *src, *tmp;
126   GstCaps *caps;
127   gint i;
128   GstBuffer *inbuf;
129   gfloat *indata;
130
131   mysrcpads = g_new0 (GstPad *, 2);
132
133   have_data = 0;
134
135   interleave = gst_element_factory_make ("interleave", NULL);
136   fail_unless (interleave != NULL);
137
138   queue = gst_element_factory_make ("queue", "queue");
139   fail_unless (queue != NULL);
140
141   sink0 = gst_element_get_request_pad (interleave, "sink_%u");
142   fail_unless (sink0 != NULL);
143   fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink_0");
144
145   sink1 = gst_element_get_request_pad (interleave, "sink_%u");
146   fail_unless (sink1 != NULL);
147   fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink_1");
148
149   mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0");
150   fail_unless (mysrcpads[0] != NULL);
151
152   caps = gst_caps_from_string (CAPS_48khz);
153   fail_unless (gst_pad_set_caps (mysrcpads[0], caps));
154   gst_pad_use_fixed_caps (mysrcpads[0]);
155
156   mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1");
157   fail_unless (mysrcpads[1] != NULL);
158
159   fail_unless (gst_pad_set_caps (mysrcpads[1], caps));
160   gst_pad_use_fixed_caps (mysrcpads[1]);
161
162   tmp = gst_element_get_static_pad (queue, "sink");
163   fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK);
164   gst_object_unref (tmp);
165   tmp = gst_element_get_static_pad (queue, "src");
166   fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK);
167   gst_object_unref (tmp);
168
169   fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK);
170
171   mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
172   fail_unless (mysinkpad != NULL);
173   gst_pad_set_chain_function (mysinkpad, interleave_chain_func);
174   gst_pad_set_active (mysinkpad, TRUE);
175
176   src = gst_element_get_static_pad (interleave, "src");
177   fail_unless (src != NULL);
178   fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK);
179   gst_object_unref (src);
180
181   bus = gst_bus_new ();
182   gst_element_set_bus (interleave, bus);
183
184   fail_unless (gst_element_set_state (interleave,
185           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
186   fail_unless (gst_element_set_state (queue,
187           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
188
189   input[0] = -1.0;
190   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
191   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
192   for (i = 0; i < 48000; i++)
193     indata[i] = -1.0;
194   gst_buffer_set_caps (inbuf, caps);
195   fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
196
197   input[1] = 1.0;
198   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
199   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
200   for (i = 0; i < 48000; i++)
201     indata[i] = 1.0;
202   gst_buffer_set_caps (inbuf, caps);
203   fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
204
205   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
206   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
207   for (i = 0; i < 48000; i++)
208     indata[i] = -1.0;
209   gst_buffer_set_caps (inbuf, caps);
210   fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
211
212   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
213   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
214   for (i = 0; i < 48000; i++)
215     indata[i] = 1.0;
216   gst_buffer_set_caps (inbuf, caps);
217   fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
218
219   fail_unless (have_data == 2);
220
221   gst_element_set_state (interleave, GST_STATE_NULL);
222   gst_element_set_state (queue, GST_STATE_NULL);
223
224   gst_object_unref (mysrcpads[0]);
225   gst_object_unref (mysrcpads[1]);
226   gst_object_unref (mysinkpad);
227
228   gst_element_release_request_pad (interleave, sink0);
229   gst_object_unref (sink0);
230   gst_element_release_request_pad (interleave, sink1);
231   gst_object_unref (sink1);
232
233   gst_object_unref (interleave);
234   gst_object_unref (queue);
235   gst_object_unref (bus);
236   gst_caps_unref (caps);
237
238   g_free (mysrcpads);
239 }
240
241 GST_END_TEST;
242
243 GST_START_TEST (test_interleave_2ch_1eos)
244 {
245   GstElement *queue;
246   GstPad *sink0, *sink1, *src, *tmp;
247   GstCaps *caps;
248   gint i;
249   GstBuffer *inbuf;
250   gfloat *indata;
251
252   mysrcpads = g_new0 (GstPad *, 2);
253
254   have_data = 0;
255
256   interleave = gst_element_factory_make ("interleave", NULL);
257   fail_unless (interleave != NULL);
258
259   queue = gst_element_factory_make ("queue", "queue");
260   fail_unless (queue != NULL);
261
262   sink0 = gst_element_get_request_pad (interleave, "sink_%u");
263   fail_unless (sink0 != NULL);
264   fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink_0");
265
266   sink1 = gst_element_get_request_pad (interleave, "sink_%u");
267   fail_unless (sink1 != NULL);
268   fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink_1");
269
270   mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0");
271   fail_unless (mysrcpads[0] != NULL);
272
273   caps = gst_caps_from_string (CAPS_48khz);
274   fail_unless (gst_pad_set_caps (mysrcpads[0], caps));
275   gst_pad_use_fixed_caps (mysrcpads[0]);
276
277   mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1");
278   fail_unless (mysrcpads[1] != NULL);
279
280   fail_unless (gst_pad_set_caps (mysrcpads[1], caps));
281   gst_pad_use_fixed_caps (mysrcpads[1]);
282
283   tmp = gst_element_get_static_pad (queue, "sink");
284   fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK);
285   gst_object_unref (tmp);
286   tmp = gst_element_get_static_pad (queue, "src");
287   fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK);
288   gst_object_unref (tmp);
289
290   fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK);
291
292   mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
293   fail_unless (mysinkpad != NULL);
294   gst_pad_set_chain_function (mysinkpad, interleave_chain_func);
295   gst_pad_set_active (mysinkpad, TRUE);
296
297   src = gst_element_get_static_pad (interleave, "src");
298   fail_unless (src != NULL);
299   fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK);
300   gst_object_unref (src);
301
302   bus = gst_bus_new ();
303   gst_element_set_bus (interleave, bus);
304
305   fail_unless (gst_element_set_state (interleave,
306           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
307   fail_unless (gst_element_set_state (queue,
308           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
309
310   input[0] = -1.0;
311   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
312   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
313   for (i = 0; i < 48000; i++)
314     indata[i] = -1.0;
315   gst_buffer_set_caps (inbuf, caps);
316   fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
317
318   input[1] = 1.0;
319   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
320   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
321   for (i = 0; i < 48000; i++)
322     indata[i] = 1.0;
323   gst_buffer_set_caps (inbuf, caps);
324   fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
325
326   input[0] = 0.0;
327   gst_pad_push_event (mysrcpads[0], gst_event_new_eos ());
328
329   input[1] = 1.0;
330   inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
331   indata = (gfloat *) GST_BUFFER_DATA (inbuf);
332   for (i = 0; i < 48000; i++)
333     indata[i] = 1.0;
334   gst_buffer_set_caps (inbuf, caps);
335   fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
336
337   fail_unless (have_data == 2);
338
339   gst_element_set_state (interleave, GST_STATE_NULL);
340   gst_element_set_state (queue, GST_STATE_NULL);
341
342   gst_object_unref (mysrcpads[0]);
343   gst_object_unref (mysrcpads[1]);
344   gst_object_unref (mysinkpad);
345
346   gst_element_release_request_pad (interleave, sink0);
347   gst_object_unref (sink0);
348   gst_element_release_request_pad (interleave, sink1);
349   gst_object_unref (sink1);
350
351   gst_object_unref (interleave);
352   gst_object_unref (queue);
353   gst_object_unref (bus);
354   gst_caps_unref (caps);
355
356   g_free (mysrcpads);
357 }
358
359 GST_END_TEST;
360
361 static void
362 src_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad,
363     gpointer user_data)
364 {
365   gint n = GPOINTER_TO_INT (user_data);
366   GstCaps *caps;
367   gfloat *data;
368   gint i;
369
370   if (GST_PAD_CAPS (pad))
371     caps = gst_caps_ref (GST_PAD_CAPS (pad));
372   else {
373     caps = gst_caps_new_simple ("audio/x-raw-float",
374         "width", G_TYPE_INT, 32,
375         "channels", G_TYPE_INT, 1,
376         "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER,
377         NULL);
378
379     if (n == 2) {
380       GstAudioChannelPosition pos[1] =
381           { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
382       gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
383     } else if (n == 3) {
384       GstAudioChannelPosition pos[1] =
385           { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT };
386       gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
387     }
388   }
389
390   data = g_new (gfloat, 48000);
391   GST_BUFFER_MALLOCDATA (buffer) = (guint8 *) data;
392   GST_BUFFER_DATA (buffer) = (guint8 *) data;
393   GST_BUFFER_SIZE (buffer) = 48000 * sizeof (gfloat);
394
395   GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
396   GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
397   GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
398   GST_BUFFER_DURATION (buffer) = GST_SECOND;
399
400   GST_BUFFER_CAPS (buffer) = caps;
401
402   for (i = 0; i < 48000; i++)
403     data[i] = (n % 2 == 0) ? -1.0 : 1.0;
404 }
405
406 static void
407 sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad,
408     gpointer user_data)
409 {
410   gint i;
411   gfloat *data;
412   GstCaps *caps;
413   gint n = GPOINTER_TO_INT (user_data);
414
415   fail_unless (GST_IS_BUFFER (buffer));
416   fail_unless_equals_int (GST_BUFFER_SIZE (buffer),
417       48000 * 2 * sizeof (gfloat));
418   fail_unless_equals_int (GST_BUFFER_DURATION (buffer), GST_SECOND);
419
420   caps = gst_caps_new_simple ("audio/x-raw-float",
421       "width", G_TYPE_INT, 32,
422       "channels", G_TYPE_INT, 2,
423       "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL);
424
425   if (n == 0) {
426     GstAudioChannelPosition pos[2] =
427         { GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE };
428     gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
429   } else if (n == 1) {
430     GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
431       GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
432     };
433     gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
434   } else if (n == 2) {
435     GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
436       GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
437     };
438     gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
439   }
440
441   fail_unless (gst_caps_is_equal (caps, GST_BUFFER_CAPS (buffer)));
442   gst_caps_unref (caps);
443
444   data = (gfloat *) GST_BUFFER_DATA (buffer);
445
446   for (i = 0; i < 48000 * 2; i += 2) {
447     fail_unless_equals_float (data[i], -1.0);
448     fail_unless_equals_float (data[i + 1], 1.0);
449   }
450
451   have_data++;
452 }
453
454 GST_START_TEST (test_interleave_2ch_pipeline)
455 {
456   GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
457   GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
458   GstMessage *msg;
459
460   have_data = 0;
461
462   pipeline = (GstElement *) gst_pipeline_new ("pipeline");
463   fail_unless (pipeline != NULL);
464
465   src1 = gst_element_factory_make ("fakesrc", "src1");
466   fail_unless (src1 != NULL);
467   g_object_set (src1, "num-buffers", 4, NULL);
468   g_object_set (src1, "signal-handoffs", TRUE, NULL);
469   g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32),
470       GINT_TO_POINTER (0));
471   gst_bin_add (GST_BIN (pipeline), src1);
472
473   src2 = gst_element_factory_make ("fakesrc", "src2");
474   fail_unless (src2 != NULL);
475   g_object_set (src2, "num-buffers", 4, NULL);
476   g_object_set (src2, "signal-handoffs", TRUE, NULL);
477   g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32),
478       GINT_TO_POINTER (1));
479   gst_bin_add (GST_BIN (pipeline), src2);
480
481   queue = gst_element_factory_make ("queue", "queue");
482   fail_unless (queue != NULL);
483   gst_bin_add (GST_BIN (pipeline), queue);
484
485   interleave = gst_element_factory_make ("interleave", "interleave");
486   fail_unless (interleave != NULL);
487   gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
488
489   sinkpad0 = gst_element_get_request_pad (interleave, "sink_%u");
490   fail_unless (sinkpad0 != NULL);
491   tmp = gst_element_get_static_pad (src1, "src");
492   fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK);
493   gst_object_unref (tmp);
494
495   sinkpad1 = gst_element_get_request_pad (interleave, "sink_%u");
496   fail_unless (sinkpad1 != NULL);
497   tmp = gst_element_get_static_pad (src2, "src");
498   tmp2 = gst_element_get_static_pad (queue, "sink");
499   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
500   gst_object_unref (tmp);
501   gst_object_unref (tmp2);
502   tmp = gst_element_get_static_pad (queue, "src");
503   fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK);
504   gst_object_unref (tmp);
505
506   sink = gst_element_factory_make ("fakesink", "sink");
507   fail_unless (sink != NULL);
508   g_object_set (sink, "signal-handoffs", TRUE, NULL);
509   g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32),
510       GINT_TO_POINTER (0));
511   gst_bin_add (GST_BIN (pipeline), sink);
512   tmp = gst_element_get_static_pad (interleave, "src");
513   tmp2 = gst_element_get_static_pad (sink, "sink");
514   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
515   gst_object_unref (tmp);
516   gst_object_unref (tmp2);
517
518   gst_element_set_state (pipeline, GST_STATE_PLAYING);
519
520   msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
521   gst_message_unref (msg);
522
523   fail_unless (have_data == 4);
524
525   gst_element_set_state (pipeline, GST_STATE_NULL);
526   gst_element_release_request_pad (interleave, sinkpad0);
527   gst_object_unref (sinkpad0);
528   gst_element_release_request_pad (interleave, sinkpad1);
529   gst_object_unref (sinkpad1);
530   gst_object_unref (interleave);
531   gst_object_unref (pipeline);
532 }
533
534 GST_END_TEST;
535
536 GST_START_TEST (test_interleave_2ch_pipeline_input_chanpos)
537 {
538   GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
539   GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
540   GstMessage *msg;
541
542   have_data = 0;
543
544   pipeline = (GstElement *) gst_pipeline_new ("pipeline");
545   fail_unless (pipeline != NULL);
546
547   src1 = gst_element_factory_make ("fakesrc", "src1");
548   fail_unless (src1 != NULL);
549   g_object_set (src1, "num-buffers", 4, NULL);
550   g_object_set (src1, "signal-handoffs", TRUE, NULL);
551   g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32),
552       GINT_TO_POINTER (2));
553   gst_bin_add (GST_BIN (pipeline), src1);
554
555   src2 = gst_element_factory_make ("fakesrc", "src2");
556   fail_unless (src2 != NULL);
557   g_object_set (src2, "num-buffers", 4, NULL);
558   g_object_set (src2, "signal-handoffs", TRUE, NULL);
559   g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32),
560       GINT_TO_POINTER (3));
561   gst_bin_add (GST_BIN (pipeline), src2);
562
563   queue = gst_element_factory_make ("queue", "queue");
564   fail_unless (queue != NULL);
565   gst_bin_add (GST_BIN (pipeline), queue);
566
567   interleave = gst_element_factory_make ("interleave", "interleave");
568   fail_unless (interleave != NULL);
569   g_object_set (interleave, "channel-positions-from-input", TRUE, NULL);
570   gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
571
572   sinkpad0 = gst_element_get_request_pad (interleave, "sink_%u");
573   fail_unless (sinkpad0 != NULL);
574   tmp = gst_element_get_static_pad (src1, "src");
575   fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK);
576   gst_object_unref (tmp);
577
578   sinkpad1 = gst_element_get_request_pad (interleave, "sink_%u");
579   fail_unless (sinkpad1 != NULL);
580   tmp = gst_element_get_static_pad (src2, "src");
581   tmp2 = gst_element_get_static_pad (queue, "sink");
582   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
583   gst_object_unref (tmp);
584   gst_object_unref (tmp2);
585   tmp = gst_element_get_static_pad (queue, "src");
586   fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK);
587   gst_object_unref (tmp);
588
589   sink = gst_element_factory_make ("fakesink", "sink");
590   fail_unless (sink != NULL);
591   g_object_set (sink, "signal-handoffs", TRUE, NULL);
592   g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32),
593       GINT_TO_POINTER (1));
594   gst_bin_add (GST_BIN (pipeline), sink);
595   tmp = gst_element_get_static_pad (interleave, "src");
596   tmp2 = gst_element_get_static_pad (sink, "sink");
597   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
598   gst_object_unref (tmp);
599   gst_object_unref (tmp2);
600
601   gst_element_set_state (pipeline, GST_STATE_PLAYING);
602
603   msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
604   gst_message_unref (msg);
605
606   fail_unless (have_data == 4);
607
608   gst_element_set_state (pipeline, GST_STATE_NULL);
609   gst_element_release_request_pad (interleave, sinkpad0);
610   gst_object_unref (sinkpad0);
611   gst_element_release_request_pad (interleave, sinkpad1);
612   gst_object_unref (sinkpad1);
613   gst_object_unref (interleave);
614   gst_object_unref (pipeline);
615 }
616
617 GST_END_TEST;
618
619 GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos)
620 {
621   GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
622   GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
623   GstMessage *msg;
624   GValueArray *arr;
625   GValue val = { 0, };
626
627   have_data = 0;
628
629   pipeline = (GstElement *) gst_pipeline_new ("pipeline");
630   fail_unless (pipeline != NULL);
631
632   src1 = gst_element_factory_make ("fakesrc", "src1");
633   fail_unless (src1 != NULL);
634   g_object_set (src1, "num-buffers", 4, NULL);
635   g_object_set (src1, "signal-handoffs", TRUE, NULL);
636   g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32),
637       GINT_TO_POINTER (0));
638   gst_bin_add (GST_BIN (pipeline), src1);
639
640   src2 = gst_element_factory_make ("fakesrc", "src2");
641   fail_unless (src2 != NULL);
642   g_object_set (src2, "num-buffers", 4, NULL);
643   g_object_set (src2, "signal-handoffs", TRUE, NULL);
644   g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32),
645       GINT_TO_POINTER (1));
646   gst_bin_add (GST_BIN (pipeline), src2);
647
648   queue = gst_element_factory_make ("queue", "queue");
649   fail_unless (queue != NULL);
650   gst_bin_add (GST_BIN (pipeline), queue);
651
652   interleave = gst_element_factory_make ("interleave", "interleave");
653   fail_unless (interleave != NULL);
654   g_object_set (interleave, "channel-positions-from-input", FALSE, NULL);
655   arr = g_value_array_new (2);
656   g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
657   g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER);
658   g_value_array_append (arr, &val);
659   g_value_reset (&val);
660   g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER);
661   g_value_array_append (arr, &val);
662   g_value_unset (&val);
663   g_object_set (interleave, "channel-positions", arr, NULL);
664   g_value_array_free (arr);
665   gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
666
667   sinkpad0 = gst_element_get_request_pad (interleave, "sink_%u");
668   fail_unless (sinkpad0 != NULL);
669   tmp = gst_element_get_static_pad (src1, "src");
670   fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK);
671   gst_object_unref (tmp);
672
673   sinkpad1 = gst_element_get_request_pad (interleave, "sink_%u");
674   fail_unless (sinkpad1 != NULL);
675   tmp = gst_element_get_static_pad (src2, "src");
676   tmp2 = gst_element_get_static_pad (queue, "sink");
677   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
678   gst_object_unref (tmp);
679   gst_object_unref (tmp2);
680   tmp = gst_element_get_static_pad (queue, "src");
681   fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK);
682   gst_object_unref (tmp);
683
684   sink = gst_element_factory_make ("fakesink", "sink");
685   fail_unless (sink != NULL);
686   g_object_set (sink, "signal-handoffs", TRUE, NULL);
687   g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32),
688       GINT_TO_POINTER (2));
689   gst_bin_add (GST_BIN (pipeline), sink);
690   tmp = gst_element_get_static_pad (interleave, "src");
691   tmp2 = gst_element_get_static_pad (sink, "sink");
692   fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK);
693   gst_object_unref (tmp);
694   gst_object_unref (tmp2);
695
696   gst_element_set_state (pipeline, GST_STATE_PLAYING);
697
698   msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
699   gst_message_unref (msg);
700
701   fail_unless (have_data == 4);
702
703   gst_element_set_state (pipeline, GST_STATE_NULL);
704   gst_element_release_request_pad (interleave, sinkpad0);
705   gst_object_unref (sinkpad0);
706   gst_element_release_request_pad (interleave, sinkpad1);
707   gst_object_unref (sinkpad1);
708   gst_object_unref (interleave);
709   gst_object_unref (pipeline);
710 }
711
712 GST_END_TEST;
713
714 static Suite *
715 interleave_suite (void)
716 {
717   Suite *s = suite_create ("interleave");
718   TCase *tc_chain = tcase_create ("general");
719
720   suite_add_tcase (s, tc_chain);
721   tcase_set_timeout (tc_chain, 180);
722   tcase_add_test (tc_chain, test_create_and_unref);
723   tcase_add_test (tc_chain, test_request_pads);
724   tcase_add_test (tc_chain, test_interleave_2ch);
725   tcase_add_test (tc_chain, test_interleave_2ch_1eos);
726   tcase_add_test (tc_chain, test_interleave_2ch_pipeline);
727   tcase_add_test (tc_chain, test_interleave_2ch_pipeline_input_chanpos);
728   tcase_add_test (tc_chain, test_interleave_2ch_pipeline_custom_chanpos);
729
730   return s;
731 }
732
733 GST_CHECK_MAIN (interleave);