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>
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.
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.
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.
25 #include <gst/check/gstcheck.h>
26 #include <gst/audio/multichannel.h>
28 GST_START_TEST (test_create_and_unref)
30 GstElement *interleave;
32 interleave = gst_element_factory_make ("interleave", NULL);
33 fail_unless (interleave != NULL);
35 gst_element_set_state (interleave, GST_STATE_NULL);
36 gst_object_unref (interleave);
41 GST_START_TEST (test_request_pads)
43 GstElement *interleave;
46 interleave = gst_element_factory_make ("interleave", NULL);
47 fail_unless (interleave != NULL);
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");
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");
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);
62 gst_element_set_state (interleave, GST_STATE_NULL);
63 gst_object_unref (interleave);
68 static GstPad **mysrcpads, *mysinkpad;
70 static GstElement *interleave;
71 static gint have_data;
72 static gfloat input[2];
74 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
77 GST_STATIC_CAPS ("audio/x-raw-float, "
79 "channels = (int) 2, "
80 "rate = (int) 48000, " "endianness = (int) BYTE_ORDER"));
82 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
85 GST_STATIC_CAPS ("audio/x-raw-float, "
87 "channels = (int) 1, "
88 "rate = (int) 48000, " "endianness = (int) BYTE_ORDER"));
91 "audio/x-raw-float, " \
92 "width = (int) 32, " \
93 "channels = (int) 1, " \
94 "rate = (int) 48000, " \
95 "endianness = (int) BYTE_ORDER"
98 interleave_chain_func (GstPad * pad, GstBuffer * buffer)
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);
108 outdata = (gfloat *) GST_BUFFER_DATA (buffer);
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]);
117 gst_buffer_unref (buffer);
122 GST_START_TEST (test_interleave_2ch)
125 GstPad *sink0, *sink1, *src, *tmp;
131 mysrcpads = g_new0 (GstPad *, 2);
135 interleave = gst_element_factory_make ("interleave", NULL);
136 fail_unless (interleave != NULL);
138 queue = gst_element_factory_make ("queue", "queue");
139 fail_unless (queue != NULL);
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");
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");
149 mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0");
150 fail_unless (mysrcpads[0] != NULL);
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]);
156 mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1");
157 fail_unless (mysrcpads[1] != NULL);
159 fail_unless (gst_pad_set_caps (mysrcpads[1], caps));
160 gst_pad_use_fixed_caps (mysrcpads[1]);
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);
169 fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK);
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);
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);
181 bus = gst_bus_new ();
182 gst_element_set_bus (interleave, bus);
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);
190 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
191 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
192 for (i = 0; i < 48000; i++)
194 gst_buffer_set_caps (inbuf, caps);
195 fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
198 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
199 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
200 for (i = 0; i < 48000; i++)
202 gst_buffer_set_caps (inbuf, caps);
203 fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
205 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
206 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
207 for (i = 0; i < 48000; i++)
209 gst_buffer_set_caps (inbuf, caps);
210 fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
212 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
213 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
214 for (i = 0; i < 48000; i++)
216 gst_buffer_set_caps (inbuf, caps);
217 fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
219 fail_unless (have_data == 2);
221 gst_element_set_state (interleave, GST_STATE_NULL);
222 gst_element_set_state (queue, GST_STATE_NULL);
224 gst_object_unref (mysrcpads[0]);
225 gst_object_unref (mysrcpads[1]);
226 gst_object_unref (mysinkpad);
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);
233 gst_object_unref (interleave);
234 gst_object_unref (queue);
235 gst_object_unref (bus);
236 gst_caps_unref (caps);
243 GST_START_TEST (test_interleave_2ch_1eos)
246 GstPad *sink0, *sink1, *src, *tmp;
252 mysrcpads = g_new0 (GstPad *, 2);
256 interleave = gst_element_factory_make ("interleave", NULL);
257 fail_unless (interleave != NULL);
259 queue = gst_element_factory_make ("queue", "queue");
260 fail_unless (queue != NULL);
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");
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");
270 mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0");
271 fail_unless (mysrcpads[0] != NULL);
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]);
277 mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1");
278 fail_unless (mysrcpads[1] != NULL);
280 fail_unless (gst_pad_set_caps (mysrcpads[1], caps));
281 gst_pad_use_fixed_caps (mysrcpads[1]);
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);
290 fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK);
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);
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);
302 bus = gst_bus_new ();
303 gst_element_set_bus (interleave, bus);
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);
311 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
312 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
313 for (i = 0; i < 48000; i++)
315 gst_buffer_set_caps (inbuf, caps);
316 fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK);
319 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
320 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
321 for (i = 0; i < 48000; i++)
323 gst_buffer_set_caps (inbuf, caps);
324 fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
327 gst_pad_push_event (mysrcpads[0], gst_event_new_eos ());
330 inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat));
331 indata = (gfloat *) GST_BUFFER_DATA (inbuf);
332 for (i = 0; i < 48000; i++)
334 gst_buffer_set_caps (inbuf, caps);
335 fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK);
337 fail_unless (have_data == 2);
339 gst_element_set_state (interleave, GST_STATE_NULL);
340 gst_element_set_state (queue, GST_STATE_NULL);
342 gst_object_unref (mysrcpads[0]);
343 gst_object_unref (mysrcpads[1]);
344 gst_object_unref (mysinkpad);
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);
351 gst_object_unref (interleave);
352 gst_object_unref (queue);
353 gst_object_unref (bus);
354 gst_caps_unref (caps);
362 src_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad,
365 gint n = GPOINTER_TO_INT (user_data);
370 if (GST_PAD_CAPS (pad))
371 caps = gst_caps_ref (GST_PAD_CAPS (pad));
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,
380 GstAudioChannelPosition pos[1] =
381 { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
382 gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
384 GstAudioChannelPosition pos[1] =
385 { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT };
386 gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
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);
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;
400 GST_BUFFER_CAPS (buffer) = caps;
402 for (i = 0; i < 48000; i++)
403 data[i] = (n % 2 == 0) ? -1.0 : 1.0;
407 sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad,
413 gint n = GPOINTER_TO_INT (user_data);
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);
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);
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);
430 GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
431 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
433 gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
435 GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
436 GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
438 gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
441 fail_unless (gst_caps_is_equal (caps, GST_BUFFER_CAPS (buffer)));
442 gst_caps_unref (caps);
444 data = (gfloat *) GST_BUFFER_DATA (buffer);
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);
454 GST_START_TEST (test_interleave_2ch_pipeline)
456 GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
457 GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
462 pipeline = (GstElement *) gst_pipeline_new ("pipeline");
463 fail_unless (pipeline != NULL);
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);
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);
481 queue = gst_element_factory_make ("queue", "queue");
482 fail_unless (queue != NULL);
483 gst_bin_add (GST_BIN (pipeline), queue);
485 interleave = gst_element_factory_make ("interleave", "interleave");
486 fail_unless (interleave != NULL);
487 gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
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);
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);
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);
518 gst_element_set_state (pipeline, GST_STATE_PLAYING);
520 msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
521 gst_message_unref (msg);
523 fail_unless (have_data == 4);
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);
536 GST_START_TEST (test_interleave_2ch_pipeline_input_chanpos)
538 GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
539 GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
544 pipeline = (GstElement *) gst_pipeline_new ("pipeline");
545 fail_unless (pipeline != NULL);
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);
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);
563 queue = gst_element_factory_make ("queue", "queue");
564 fail_unless (queue != NULL);
565 gst_bin_add (GST_BIN (pipeline), queue);
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));
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);
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);
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);
601 gst_element_set_state (pipeline, GST_STATE_PLAYING);
603 msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
604 gst_message_unref (msg);
606 fail_unless (have_data == 4);
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);
619 GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos)
621 GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
622 GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
629 pipeline = (GstElement *) gst_pipeline_new ("pipeline");
630 fail_unless (pipeline != NULL);
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);
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);
648 queue = gst_element_factory_make ("queue", "queue");
649 fail_unless (queue != NULL);
650 gst_bin_add (GST_BIN (pipeline), queue);
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));
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);
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);
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);
696 gst_element_set_state (pipeline, GST_STATE_PLAYING);
698 msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
699 gst_message_unref (msg);
701 fail_unless (have_data == 4);
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);
715 interleave_suite (void)
717 Suite *s = suite_create ("interleave");
718 TCase *tc_chain = tcase_create ("general");
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);
733 GST_CHECK_MAIN (interleave);