2 * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
4 * gstpad.c: Unit test for GstPad
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
22 #include <gst/check/gstcheck.h>
24 static GstSegment dummy_segment;
26 GST_START_TEST (test_link)
34 src = gst_pad_new ("source", GST_PAD_SRC);
35 fail_if (src == NULL);
36 ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
38 name = gst_pad_get_name (src);
39 fail_unless (strcmp (name, "source") == 0);
40 ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
43 sink = gst_pad_new ("sink", GST_PAD_SINK);
44 fail_if (sink == NULL);
46 /* linking without templates or caps should work */
47 ret = gst_pad_link (src, sink);
48 ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
49 ASSERT_OBJECT_REFCOUNT (sink, "sink pad", 1);
50 fail_unless (ret == GST_PAD_LINK_OK);
52 ASSERT_CRITICAL (gst_pad_get_pad_template (NULL));
54 srct = gst_pad_get_pad_template (src);
55 fail_unless (srct == NULL);
56 ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
59 ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
60 gst_object_unref (src);
61 gst_object_unref (sink);
66 /* threaded link/unlink */
68 static GstPad *src, *sink;
71 thread_link_unlink (gpointer data)
75 while (THREAD_TEST_RUNNING ()) {
76 gst_pad_link (src, sink);
77 gst_pad_unlink (src, sink);
82 GST_START_TEST (test_link_unlink_threaded)
87 src = gst_pad_new ("source", GST_PAD_SRC);
88 fail_if (src == NULL);
89 sink = gst_pad_new ("sink", GST_PAD_SINK);
90 fail_if (sink == NULL);
92 caps = gst_caps_from_string ("foo/bar");
93 gst_pad_set_active (src, TRUE);
94 gst_pad_set_caps (src, caps);
95 gst_pad_set_active (sink, TRUE);
96 gst_pad_set_caps (sink, caps);
97 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
99 MAIN_START_THREADS (5, thread_link_unlink, NULL);
100 for (i = 0; i < 1000; ++i) {
101 gst_pad_is_linked (src);
102 gst_pad_is_linked (sink);
105 MAIN_STOP_THREADS ();
107 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
108 gst_caps_unref (caps);
110 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
111 gst_object_unref (src);
112 gst_object_unref (sink);
117 GST_START_TEST (test_refcount)
121 GstPadLinkReturn plr;
123 sink = gst_pad_new ("sink", GST_PAD_SINK);
124 fail_if (sink == NULL);
126 src = gst_pad_new ("src", GST_PAD_SRC);
127 fail_if (src == NULL);
129 caps = gst_caps_from_string ("foo/bar");
131 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
133 /* can't set caps on flushing sinkpad */
134 fail_if (gst_pad_set_caps (src, caps) == TRUE);
135 fail_if (gst_pad_set_caps (sink, caps) == TRUE);
136 /* one for me and one for each set_caps */
137 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
139 gst_pad_set_active (src, TRUE);
140 fail_unless (gst_pad_set_caps (src, caps) == TRUE);
141 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
143 gst_pad_set_active (sink, TRUE);
144 fail_unless (gst_pad_set_caps (sink, caps) == TRUE);
145 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
147 plr = gst_pad_link (src, sink);
148 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
149 /* src caps added to pending caps on sink */
150 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
152 gst_pad_unlink (src, sink);
153 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
156 gst_object_unref (src);
157 gst_object_unref (sink);
158 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
160 gst_caps_unref (caps);
165 GST_START_TEST (test_get_allowed_caps)
168 GstCaps *caps, *gotcaps;
170 GstPadLinkReturn plr;
172 ASSERT_CRITICAL (gst_pad_get_allowed_caps (NULL));
174 buffer = gst_buffer_new ();
175 ASSERT_CRITICAL (gst_pad_get_allowed_caps ((GstPad *) buffer));
176 gst_buffer_unref (buffer);
178 src = gst_pad_new ("src", GST_PAD_SRC);
179 fail_if (src == NULL);
180 caps = gst_pad_get_allowed_caps (src);
181 fail_unless (caps == NULL);
183 caps = gst_caps_from_string ("foo/bar");
185 sink = gst_pad_new ("sink", GST_PAD_SINK);
186 gst_pad_set_active (src, TRUE);
187 /* source pad is active and will accept the caps event */
188 fail_unless (gst_pad_set_caps (src, caps) == TRUE);
189 /* sink pad is not active and will refuse the caps event */
190 fail_if (gst_pad_set_caps (sink, caps) == TRUE);
191 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
193 gst_pad_set_active (sink, TRUE);
194 /* sink pad is now active and will accept the caps event */
195 fail_unless (gst_pad_set_caps (sink, caps) == TRUE);
196 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
198 plr = gst_pad_link (src, sink);
199 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
201 gotcaps = gst_pad_get_allowed_caps (src);
202 fail_if (gotcaps == NULL);
203 fail_unless (gst_caps_is_equal (gotcaps, caps));
205 ASSERT_CAPS_REFCOUNT (gotcaps, "gotcaps", 4);
206 gst_caps_unref (gotcaps);
208 gst_pad_unlink (src, sink);
211 ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
212 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
213 ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
215 gst_object_unref (src);
216 gst_object_unref (sink);
218 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
219 gst_caps_unref (caps);
224 static GstCaps *event_caps = NULL;
227 sticky_event (GstPad * pad, GstObject * parent, GstEvent * event)
231 fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CAPS
232 || GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START
233 || GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
235 if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS) {
236 gst_event_unref (event);
240 /* Ensure we get here just once: */
241 fail_unless (event_caps == NULL);
243 /* The event must arrive before any buffer: */
244 fail_unless_equals_int (g_list_length (buffers), 0);
246 gst_event_parse_caps (event, &caps);
247 event_caps = gst_caps_ref (caps);
249 gst_event_unref (event);
254 /* Tests whether caps get properly forwarded when pads
255 are initially unlinked */
256 GST_START_TEST (test_sticky_caps_unlinked)
259 GstPadTemplate *src_template, *sink_template;
263 caps = gst_caps_from_string ("foo/bar, dummy=(int){1, 2}");
264 src_template = gst_pad_template_new ("src", GST_PAD_SRC,
265 GST_PAD_ALWAYS, caps);
266 sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
267 GST_PAD_ALWAYS, caps);
268 gst_caps_unref (caps);
270 src = gst_pad_new_from_template (src_template, "src");
271 fail_if (src == NULL);
272 sink = gst_pad_new_from_template (sink_template, "sink");
273 fail_if (sink == NULL);
274 gst_pad_set_event_function (sink, sticky_event);
275 gst_pad_set_chain_function (sink, gst_check_chain_func);
277 gst_object_unref (src_template);
278 gst_object_unref (sink_template);
280 gst_pad_set_active (src, TRUE);
282 fail_unless (gst_pad_push_event (src,
283 gst_event_new_stream_start ("test")) == TRUE);
285 caps = gst_caps_from_string ("foo/bar, dummy=(int)1");
286 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
288 event = gst_event_new_caps (caps);
289 fail_unless (gst_pad_push_event (src, event) == TRUE);
290 fail_unless (event_caps == NULL);
292 fail_unless (gst_pad_push_event (src,
293 gst_event_new_segment (&dummy_segment)) == TRUE);
295 /* Linking and activating will not forward the sticky event yet... */
296 fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (src, sink)));
297 gst_pad_set_active (sink, TRUE);
298 fail_unless (event_caps == NULL);
300 /* ...but the first buffer will: */
301 fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
302 fail_unless (event_caps == caps);
303 fail_unless_equals_int (g_list_length (buffers), 1);
305 gst_check_drop_buffers ();
307 gst_caps_replace (&caps, NULL);
308 gst_caps_replace (&event_caps, NULL);
309 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
310 ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
311 gst_object_unref (src);
312 gst_object_unref (sink);
317 /* Same as test_sticky_caps_unlinked except that the source pad
318 * has a template of ANY and we will attempt to push
319 * incompatible caps */
320 GST_START_TEST (test_sticky_caps_unlinked_incompatible)
322 GstCaps *caps, *failcaps;
323 GstPadTemplate *src_template, *sink_template;
327 /* Source pad has ANY caps
328 * Sink pad has foobar caps
329 * We will push the pony express caps (which should fail)
331 caps = gst_caps_new_any ();
332 src_template = gst_pad_template_new ("src", GST_PAD_SRC,
333 GST_PAD_ALWAYS, caps);
334 gst_caps_unref (caps);
335 caps = gst_caps_from_string ("foo/bar, dummy=(int){1, 2}");
336 sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
337 GST_PAD_ALWAYS, caps);
338 gst_caps_unref (caps);
340 src = gst_pad_new_from_template (src_template, "src");
341 fail_if (src == NULL);
342 sink = gst_pad_new_from_template (sink_template, "sink");
343 fail_if (sink == NULL);
344 gst_pad_set_event_function (sink, sticky_event);
345 gst_pad_set_chain_function (sink, gst_check_chain_func);
347 gst_object_unref (src_template);
348 gst_object_unref (sink_template);
350 gst_pad_set_active (src, TRUE);
352 fail_unless (gst_pad_push_event (src,
353 gst_event_new_stream_start ("test")) == TRUE);
355 failcaps = gst_caps_from_string ("pony/express, failure=(boolean)true");
356 ASSERT_CAPS_REFCOUNT (failcaps, "caps", 1);
358 event = gst_event_new_caps (failcaps);
359 gst_caps_unref (failcaps);
360 /* The pad isn't linked yet, and anything matches the source pad template
362 fail_unless (gst_pad_push_event (src, event) == TRUE);
363 fail_unless (event_caps == NULL);
365 fail_unless (gst_pad_push_event (src,
366 gst_event_new_segment (&dummy_segment)) == TRUE);
368 /* Linking and activating will not forward the sticky event yet... */
369 fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (src, sink)));
370 gst_pad_set_active (sink, TRUE);
371 fail_unless (event_caps == NULL);
373 /* ...but the first buffer will and should FAIL since the caps
374 * are not compatible */
375 fail_unless (gst_pad_push (src,
376 gst_buffer_new ()) == GST_FLOW_NOT_NEGOTIATED);
377 /* We shouldn't have received the caps event since it's incompatible */
378 fail_unless (event_caps == NULL);
379 /* We shouldn't have received any buffers since caps are incompatible */
380 fail_unless_equals_int (g_list_length (buffers), 0);
382 gst_check_drop_buffers ();
384 gst_caps_replace (&event_caps, NULL);
386 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
387 ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
388 gst_object_unref (src);
389 gst_object_unref (sink);
394 /* Like test_sticky_caps_unlinked, but link before caps: */
396 GST_START_TEST (test_sticky_caps_flushing)
399 GstPadTemplate *src_template, *sink_template;
403 caps = gst_caps_from_string ("foo/bar, dummy=(int){1, 2}");
404 src_template = gst_pad_template_new ("src", GST_PAD_SRC,
405 GST_PAD_ALWAYS, caps);
406 sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
407 GST_PAD_ALWAYS, caps);
408 gst_caps_unref (caps);
410 src = gst_pad_new_from_template (src_template, "src");
411 fail_if (src == NULL);
412 sink = gst_pad_new_from_template (sink_template, "sink");
413 fail_if (sink == NULL);
414 gst_pad_set_event_function (sink, sticky_event);
415 gst_pad_set_chain_function (sink, gst_check_chain_func);
417 gst_object_unref (src_template);
418 gst_object_unref (sink_template);
420 fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (src, sink)));
422 caps = gst_caps_from_string ("foo/bar, dummy=(int)1");
423 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
425 event = gst_event_new_caps (caps);
427 gst_pad_set_active (src, TRUE);
428 fail_unless (gst_pad_push_event (src,
429 gst_event_new_stream_start ("test")) == TRUE);
430 /* The caps event gets accepted by the source pad (and stored) */
431 fail_unless (gst_pad_push_event (src, event) == TRUE);
432 /* But wasn't forwarded since the sink pad is flushing (not activated) */
433 fail_unless (event_caps == NULL);
435 fail_unless (gst_pad_push_event (src,
436 gst_event_new_segment (&dummy_segment)) == TRUE);
438 /* Activating will not forward the sticky event yet... */
439 gst_pad_set_active (sink, TRUE);
440 fail_unless (event_caps == NULL);
442 /* ...but the first buffer will: */
443 fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
444 fail_unless (event_caps == caps);
445 fail_unless_equals_int (g_list_length (buffers), 1);
447 gst_check_drop_buffers ();
449 gst_caps_replace (&caps, NULL);
450 gst_caps_replace (&event_caps, NULL);
452 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
453 ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
454 gst_object_unref (src);
455 gst_object_unref (sink);
461 name_is_valid (const gchar * name, GstPadPresence presence)
464 GstCaps *any = gst_caps_new_any ();
466 new = gst_pad_template_new (name, GST_PAD_SRC, presence, any);
467 gst_caps_unref (any);
469 gst_object_unref (GST_OBJECT (new));
475 GST_START_TEST (test_name_is_valid)
477 gboolean result = FALSE;
479 fail_unless (name_is_valid ("src", GST_PAD_ALWAYS));
480 ASSERT_WARNING (name_is_valid ("src%", GST_PAD_ALWAYS));
481 ASSERT_WARNING (result = name_is_valid ("src%d", GST_PAD_ALWAYS));
484 fail_unless (name_is_valid ("src", GST_PAD_REQUEST));
485 ASSERT_WARNING (name_is_valid ("src%s%s", GST_PAD_REQUEST));
486 ASSERT_WARNING (name_is_valid ("src%c", GST_PAD_REQUEST));
487 ASSERT_WARNING (name_is_valid ("src%", GST_PAD_REQUEST));
488 ASSERT_WARNING (name_is_valid ("src%dsrc", GST_PAD_REQUEST));
490 fail_unless (name_is_valid ("src", GST_PAD_SOMETIMES));
491 fail_unless (name_is_valid ("src%c", GST_PAD_SOMETIMES));
496 static GstPadProbeReturn
497 _probe_handler (GstPad * pad, GstPadProbeInfo * info, gpointer userdata)
499 gint ret = GPOINTER_TO_INT (userdata);
502 return GST_PAD_PROBE_OK;
504 return GST_PAD_PROBE_DROP;
507 GST_START_TEST (test_push_unlinked)
514 src = gst_pad_new ("src", GST_PAD_SRC);
515 fail_if (src == NULL);
516 caps = gst_pad_get_allowed_caps (src);
517 fail_unless (caps == NULL);
519 caps = gst_caps_from_string ("foo/bar");
521 /* pushing on an inactive pad will return wrong state */
522 GST_DEBUG ("push buffer inactive");
523 buffer = gst_buffer_new ();
524 gst_buffer_ref (buffer);
525 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_FLUSHING);
526 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
527 gst_buffer_unref (buffer);
529 gst_pad_set_active (src, TRUE);
530 fail_unless (gst_pad_push_event (src,
531 gst_event_new_stream_start ("test")) == TRUE);
532 GST_DEBUG ("push caps event inactive");
533 gst_pad_set_caps (src, caps);
534 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
535 fail_unless (gst_pad_push_event (src,
536 gst_event_new_segment (&dummy_segment)) == TRUE);
538 /* pushing on an unlinked pad will drop the buffer */
539 GST_DEBUG ("push buffer unlinked");
540 buffer = gst_buffer_new ();
541 gst_buffer_ref (buffer);
542 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_NOT_LINKED);
543 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
544 gst_buffer_unref (buffer);
546 /* adding a probe that returns _DROP will drop the buffer without trying
548 GST_DEBUG ("push buffer drop");
549 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER,
550 _probe_handler, GINT_TO_POINTER (0), NULL);
551 buffer = gst_buffer_new ();
552 gst_buffer_ref (buffer);
553 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
554 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
555 gst_buffer_unref (buffer);
556 gst_pad_remove_probe (src, id);
558 /* adding a probe that returns _OK will still chain the buffer,
559 * and hence drop because pad is unlinked */
560 GST_DEBUG ("push buffer ok");
561 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER,
562 _probe_handler, GINT_TO_POINTER (1), NULL);
563 buffer = gst_buffer_new ();
564 gst_buffer_ref (buffer);
565 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_NOT_LINKED);
566 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
567 gst_buffer_unref (buffer);
568 gst_pad_remove_probe (src, id);
572 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
573 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
575 gst_object_unref (src);
577 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
578 gst_caps_unref (caps);
583 GST_START_TEST (test_push_linked)
586 GstPadLinkReturn plr;
592 sink = gst_pad_new ("sink", GST_PAD_SINK);
593 fail_if (sink == NULL);
594 gst_pad_set_chain_function (sink, gst_check_chain_func);
596 src = gst_pad_new ("src", GST_PAD_SRC);
597 fail_if (src == NULL);
599 caps = gst_caps_from_string ("foo/bar");
601 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
603 gst_pad_set_active (src, TRUE);
605 fail_unless (gst_pad_push_event (src,
606 gst_event_new_stream_start ("test")) == TRUE);
608 gst_pad_set_caps (src, caps);
610 fail_unless (gst_pad_push_event (src,
611 gst_event_new_segment (&dummy_segment)) == TRUE);
613 gst_pad_set_active (sink, TRUE);
614 /* one for me and one for each set_caps */
615 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
617 plr = gst_pad_link (src, sink);
618 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
619 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
621 buffer = gst_buffer_new ();
624 /* pushing on a linked pad will drop the ref to the buffer */
625 gst_buffer_ref (buffer);
626 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
627 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2);
628 gst_buffer_unref (buffer);
629 fail_unless_equals_int (g_list_length (buffers), 1);
630 buffer = GST_BUFFER (buffers->data);
631 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
632 gst_buffer_unref (buffer);
633 g_list_free (buffers);
636 /* adding a probe that returns FALSE will drop the buffer without trying
638 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER,
639 _probe_handler, GINT_TO_POINTER (0), NULL);
640 buffer = gst_buffer_new ();
641 gst_buffer_ref (buffer);
642 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
643 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
644 gst_buffer_unref (buffer);
645 gst_pad_remove_probe (src, id);
646 fail_unless_equals_int (g_list_length (buffers), 0);
648 /* adding a probe that returns TRUE will still chain the buffer */
649 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER,
650 _probe_handler, GINT_TO_POINTER (1), NULL);
651 buffer = gst_buffer_new ();
652 gst_buffer_ref (buffer);
653 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
654 gst_pad_remove_probe (src, id);
656 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2);
657 gst_buffer_unref (buffer);
658 fail_unless_equals_int (g_list_length (buffers), 1);
659 buffer = GST_BUFFER (buffers->data);
660 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
661 gst_buffer_unref (buffer);
662 g_list_free (buffers);
666 gst_pad_unlink (src, sink);
667 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
668 gst_object_unref (src);
669 gst_object_unref (sink);
670 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
672 gst_caps_unref (caps);
677 GST_START_TEST (test_push_linked_flushing)
681 GstPadLinkReturn plr;
686 src = gst_pad_new ("src", GST_PAD_SRC);
687 fail_if (src == NULL);
688 sink = gst_pad_new ("sink", GST_PAD_SINK);
689 fail_if (sink == NULL);
690 gst_pad_set_chain_function (sink, gst_check_chain_func);
692 caps = gst_pad_get_allowed_caps (src);
693 fail_unless (caps == NULL);
694 caps = gst_pad_get_allowed_caps (sink);
695 fail_unless (caps == NULL);
697 caps = gst_caps_from_string ("foo/bar");
699 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
701 gst_pad_set_active (src, TRUE);
702 fail_unless (gst_pad_push_event (src,
703 gst_event_new_stream_start ("test")) == TRUE);
704 gst_pad_set_caps (src, caps);
705 fail_unless (gst_pad_push_event (src,
706 gst_event_new_segment (&dummy_segment)) == TRUE);
707 /* need to activate to make it accept the caps */
708 gst_pad_set_active (sink, TRUE);
709 /* one for me and one for each set_caps */
710 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
712 plr = gst_pad_link (src, sink);
713 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
714 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
716 /* not activating the pads here, which keeps them flushing */
717 gst_pad_set_active (src, FALSE);
718 gst_pad_set_active (sink, FALSE);
720 /* pushing on a flushing pad will drop the buffer */
721 buffer = gst_buffer_new ();
722 gst_buffer_ref (buffer);
723 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_FLUSHING);
724 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
725 fail_unless_equals_int (g_list_length (buffers), 0);
726 gst_buffer_unref (buffer);
728 gst_pad_set_active (src, TRUE);
729 gst_pad_set_active (sink, FALSE);
731 fail_unless (gst_pad_push_event (src,
732 gst_event_new_stream_start ("test")) == TRUE);
733 gst_pad_set_caps (src, caps);
734 fail_unless (gst_pad_push_event (src,
735 gst_event_new_segment (&dummy_segment)) == TRUE);
736 /* adding a probe that returns FALSE will drop the buffer without trying
738 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER, _probe_handler,
739 GINT_TO_POINTER (0), NULL);
740 buffer = gst_buffer_new ();
741 gst_buffer_ref (buffer);
742 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_FLUSHING);
743 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
744 fail_unless_equals_int (g_list_length (buffers), 0);
745 gst_buffer_unref (buffer);
746 gst_pad_remove_probe (src, id);
748 /* adding a probe that returns TRUE will still chain the buffer,
749 * and hence drop because pad is flushing */
750 id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER, _probe_handler,
751 GINT_TO_POINTER (1), NULL);
752 buffer = gst_buffer_new ();
753 gst_buffer_ref (buffer);
754 fail_unless (gst_pad_push (src, buffer) == GST_FLOW_FLUSHING);
755 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
756 fail_unless_equals_int (g_list_length (buffers), 0);
757 gst_buffer_unref (buffer);
758 gst_pad_remove_probe (src, id);
761 ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
762 ASSERT_OBJECT_REFCOUNT (src, "src", 1);
763 gst_pad_link (src, sink);
764 gst_object_unref (src);
765 gst_object_unref (sink);
766 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
767 gst_caps_unref (caps);
773 buffer_from_string (const gchar * str)
779 buf = gst_buffer_new_and_alloc (size);
781 gst_buffer_fill (buf, 0, str, size);
787 buffer_compare (GstBuffer * buf, const gchar * str, gsize size)
792 fail_unless (gst_buffer_map (buf, &info, GST_MAP_READ));
793 res = memcmp (info.data, str, size) == 0;
794 GST_DEBUG ("%s <-> %s: %d", (gchar *) info.data, str, res);
795 gst_buffer_unmap (buf, &info);
800 GST_START_TEST (test_push_buffer_list_compat)
803 GstPadLinkReturn plr;
809 sink = gst_pad_new ("sink", GST_PAD_SINK);
810 fail_if (sink == NULL);
811 gst_pad_set_chain_function (sink, gst_check_chain_func);
812 /* leave chainlistfunc unset */
814 src = gst_pad_new ("src", GST_PAD_SRC);
815 fail_if (src == NULL);
817 caps = gst_caps_from_string ("foo/bar");
819 gst_pad_set_active (src, TRUE);
821 fail_unless (gst_pad_push_event (src,
822 gst_event_new_stream_start ("test")) == TRUE);
824 gst_pad_set_caps (src, caps);
826 fail_unless (gst_pad_push_event (src,
827 gst_event_new_segment (&dummy_segment)) == TRUE);
829 gst_pad_set_active (sink, TRUE);
831 plr = gst_pad_link (src, sink);
832 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
834 list = gst_buffer_list_new ();
837 /* adding to a buffer list will drop the ref to the buffer */
838 gst_buffer_list_add (list, buffer_from_string ("ListGroup"));
839 gst_buffer_list_add (list, buffer_from_string ("AnotherListGroup"));
841 fail_unless (gst_pad_push_list (src, list) == GST_FLOW_OK);
842 fail_unless_equals_int (g_list_length (buffers), 2);
843 buffer = GST_BUFFER (buffers->data);
844 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
845 fail_unless (buffer_compare (buffer, "ListGroup", 9));
846 gst_buffer_unref (buffer);
847 buffers = g_list_delete_link (buffers, buffers);
848 buffer = GST_BUFFER (buffers->data);
849 ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
850 fail_unless (buffer_compare (buffer, "AnotherListGroup", 16));
851 gst_buffer_unref (buffer);
852 buffers = g_list_delete_link (buffers, buffers);
853 fail_unless (buffers == NULL);
856 gst_pad_unlink (src, sink);
857 gst_object_unref (src);
858 gst_object_unref (sink);
859 ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
860 gst_caps_unref (caps);
865 GST_START_TEST (test_flowreturn)
870 /* test some of the macros */
872 fail_if (strcmp (gst_flow_get_name (ret), "eos"));
873 quark = gst_flow_to_quark (ret);
874 fail_if (strcmp (g_quark_to_string (quark), "eos"));
877 ret = GST_FLOW_CUSTOM_SUCCESS;
878 fail_if (strcmp (gst_flow_get_name (ret), "custom-success"));
879 quark = gst_flow_to_quark (ret);
880 fail_if (strcmp (g_quark_to_string (quark), "custom-success"));
882 ret = GST_FLOW_CUSTOM_ERROR;
883 fail_if (strcmp (gst_flow_get_name (ret), "custom-error"));
884 quark = gst_flow_to_quark (ret);
885 fail_if (strcmp (g_quark_to_string (quark), "custom-error"));
887 /* custom returns clamping */
888 ret = GST_FLOW_CUSTOM_SUCCESS + 2;
889 fail_if (strcmp (gst_flow_get_name (ret), "custom-success"));
890 quark = gst_flow_to_quark (ret);
891 fail_if (strcmp (g_quark_to_string (quark), "custom-success"));
893 ret = GST_FLOW_CUSTOM_ERROR - 2;
894 fail_if (strcmp (gst_flow_get_name (ret), "custom-error"));
895 quark = gst_flow_to_quark (ret);
896 fail_if (strcmp (g_quark_to_string (quark), "custom-error"));
899 ret = GST_FLOW_CUSTOM_ERROR + 2;
900 fail_if (strcmp (gst_flow_get_name (ret), "unknown"));
901 quark = gst_flow_to_quark (ret);
902 fail_unless (quark == 0);
907 GST_START_TEST (test_push_negotiation)
910 GstPadLinkReturn plr;
912 gst_caps_from_string ("audio/x-raw,width={16,32},depth={16,32}");
914 gst_caps_from_string ("audio/x-raw,width=32,depth={16,32}");
915 GstPadTemplate *src_template;
916 GstPadTemplate *sink_template;
920 src_template = gst_pad_template_new ("src", GST_PAD_SRC,
921 GST_PAD_ALWAYS, srccaps);
922 sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
923 GST_PAD_ALWAYS, sinkcaps);
924 gst_caps_unref (srccaps);
925 gst_caps_unref (sinkcaps);
927 sink = gst_pad_new_from_template (sink_template, "sink");
928 fail_if (sink == NULL);
929 gst_pad_set_chain_function (sink, gst_check_chain_func);
931 src = gst_pad_new_from_template (src_template, "src");
932 fail_if (src == NULL);
934 plr = gst_pad_link (src, sink);
935 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
938 gst_pad_set_active (src, TRUE);
939 gst_pad_set_active (sink, TRUE);
941 caps = gst_caps_from_string ("audio/x-raw,width=16,depth=16");
943 /* Should fail if src pad caps are incompatible with sink pad caps */
944 gst_pad_set_caps (src, caps);
945 fail_unless (gst_pad_set_caps (sink, caps) == FALSE);
948 gst_pad_unlink (src, sink);
949 gst_object_unref (src);
950 gst_object_unref (sink);
951 gst_caps_unref (caps);
952 gst_object_unref (sink_template);
953 gst_object_unref (src_template);
958 /* see that an unref also unlinks the pads */
959 GST_START_TEST (test_src_unref_unlink)
963 GstPadLinkReturn plr;
965 sink = gst_pad_new ("sink", GST_PAD_SINK);
966 fail_if (sink == NULL);
968 src = gst_pad_new ("src", GST_PAD_SRC);
969 fail_if (src == NULL);
971 caps = gst_caps_from_string ("foo/bar");
973 gst_pad_set_active (src, TRUE);
974 gst_pad_set_caps (src, caps);
975 gst_pad_set_active (sink, TRUE);
976 gst_pad_set_caps (sink, caps);
978 plr = gst_pad_link (src, sink);
979 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
981 /* unref the srcpad */
982 gst_object_unref (src);
984 /* sink should be unlinked now */
985 fail_if (gst_pad_is_linked (sink));
988 gst_object_unref (sink);
989 gst_caps_unref (caps);
994 /* see that an unref also unlinks the pads */
995 GST_START_TEST (test_sink_unref_unlink)
999 GstPadLinkReturn plr;
1001 sink = gst_pad_new ("sink", GST_PAD_SINK);
1002 fail_if (sink == NULL);
1004 src = gst_pad_new ("src", GST_PAD_SRC);
1005 fail_if (src == NULL);
1007 caps = gst_caps_from_string ("foo/bar");
1009 gst_pad_set_active (src, TRUE);
1010 gst_pad_set_caps (src, caps);
1011 gst_pad_set_active (sink, TRUE);
1012 gst_pad_set_caps (sink, caps);
1014 plr = gst_pad_link (src, sink);
1015 fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
1017 /* unref the sinkpad */
1018 gst_object_unref (sink);
1020 /* src should be unlinked now */
1021 fail_if (gst_pad_is_linked (src));
1024 gst_object_unref (src);
1025 gst_caps_unref (caps);
1032 static GstPadProbeReturn
1033 block_async_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1035 gboolean *bool_user_data = (gboolean *) user_data;
1037 fail_unless ((info->type & GST_PAD_PROBE_TYPE_BLOCK) != 0);
1039 /* here we should have blocked == 0 unblocked == 0 */
1040 fail_unless (bool_user_data[0] == FALSE);
1041 fail_unless (bool_user_data[1] == FALSE);
1043 bool_user_data[0] = TRUE;
1045 gst_pad_remove_probe (pad, id);
1046 bool_user_data[1] = TRUE;
1048 return GST_PAD_PROBE_OK;
1051 GST_START_TEST (test_block_async)
1054 /* we set data[0] = TRUE when the pad is blocked, data[1] = TRUE when it's
1056 gboolean data[2] = { FALSE, FALSE };
1058 pad = gst_pad_new ("src", GST_PAD_SRC);
1059 fail_unless (pad != NULL);
1061 gst_pad_set_active (pad, TRUE);
1063 fail_unless (gst_pad_push_event (pad,
1064 gst_event_new_stream_start ("test")) == TRUE);
1065 fail_unless (gst_pad_push_event (pad,
1066 gst_event_new_segment (&dummy_segment)) == TRUE);
1068 id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_cb, &data,
1071 fail_unless (data[0] == FALSE);
1072 fail_unless (data[1] == FALSE);
1073 gst_pad_push (pad, gst_buffer_new ());
1075 gst_object_unref (pad);
1080 static GstPadProbeReturn
1081 block_async_cb_return_ok (GstPad * pad, GstPadProbeInfo * info,
1084 return GST_PAD_PROBE_OK;
1088 push_buffer_async (GstPad * pad)
1090 return GINT_TO_POINTER (gst_pad_push (pad, gst_buffer_new ()));
1094 test_pad_blocking_with_type (GstPadProbeType type)
1100 pad = gst_pad_new ("src", GST_PAD_SRC);
1101 fail_unless (pad != NULL);
1103 gst_pad_set_active (pad, TRUE);
1105 fail_unless (gst_pad_push_event (pad,
1106 gst_event_new_stream_start ("test")) == TRUE);
1107 fail_unless (gst_pad_push_event (pad,
1108 gst_event_new_segment (&dummy_segment)) == TRUE);
1110 id = gst_pad_add_probe (pad, type, block_async_cb_return_ok, NULL, NULL);
1112 thread = g_thread_try_new ("gst-check", (GThreadFunc) push_buffer_async,
1115 /* wait for the block */
1116 while (!gst_pad_is_blocking (pad)) {
1120 /* stop with flushing */
1121 gst_pad_push_event (pad, gst_event_new_flush_start ());
1123 /* get return value from push */
1124 ret = GPOINTER_TO_INT (g_thread_join (thread));
1126 gst_pad_push_event (pad, gst_event_new_flush_stop (FALSE));
1127 /* must be wrong state */
1128 fail_unless (ret == GST_FLOW_FLUSHING);
1130 gst_object_unref (pad);
1133 GST_START_TEST (test_pad_blocking_with_probe_type_block)
1135 test_pad_blocking_with_type (GST_PAD_PROBE_TYPE_BLOCK);
1140 GST_START_TEST (test_pad_blocking_with_probe_type_blocking)
1142 test_pad_blocking_with_type (GST_PAD_PROBE_TYPE_BLOCKING);
1147 static gboolean idle_probe_running;
1149 static GstFlowReturn
1150 idletest_sink_pad_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
1152 if (idle_probe_running)
1153 fail ("Should not be reached");
1157 static GstPadProbeReturn
1158 idle_probe_wait (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1160 /* it is ok to have a probe called multiple times but it is not
1161 * acceptable in our scenario */
1162 fail_if (idle_probe_running);
1164 idle_probe_running = TRUE;
1165 while (idle_probe_running) {
1169 return GST_PAD_PROBE_REMOVE;
1173 add_idle_probe_async (GstPad * pad)
1175 gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_IDLE, idle_probe_wait, NULL, NULL);
1180 GST_START_TEST (test_pad_blocking_with_probe_type_idle)
1182 GstPad *srcpad, *sinkpad;
1183 GThread *idle_thread, *thread;
1185 srcpad = gst_pad_new ("src", GST_PAD_SRC);
1186 fail_unless (srcpad != NULL);
1187 sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
1188 fail_unless (sinkpad != NULL);
1190 gst_pad_set_chain_function (sinkpad, idletest_sink_pad_chain);
1192 fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK);
1194 gst_pad_set_active (sinkpad, TRUE);
1195 gst_pad_set_active (srcpad, TRUE);
1197 fail_unless (gst_pad_push_event (srcpad,
1198 gst_event_new_stream_start ("test")) == TRUE);
1199 fail_unless (gst_pad_push_event (srcpad,
1200 gst_event_new_segment (&dummy_segment)) == TRUE);
1202 idle_probe_running = FALSE;
1204 g_thread_try_new ("gst-check", (GThreadFunc) add_idle_probe_async, srcpad,
1207 /* wait for the idle function to signal it is being called */
1208 while (!idle_probe_running) {
1212 thread = g_thread_try_new ("gst-check", (GThreadFunc) push_buffer_async,
1215 while (!gst_pad_is_blocking (srcpad)) {
1219 idle_probe_running = FALSE;
1221 g_thread_join (idle_thread);
1222 g_thread_join (thread);
1223 gst_object_unref (srcpad);
1224 gst_object_unref (sinkpad);
1229 static gboolean pad_probe_remove_notifiy_called = FALSE;
1231 static GstPadProbeReturn
1232 probe_remove_self_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1234 gst_pad_remove_probe (pad, info->id);
1236 fail_unless (pad->num_probes == 0);
1237 fail_unless (pad->num_blocked == 0);
1239 return GST_PAD_PROBE_REMOVE;
1243 probe_remove_notify_cb (gpointer data)
1245 fail_unless (pad_probe_remove_notifiy_called == FALSE);
1246 pad_probe_remove_notifiy_called = TRUE;
1249 GST_START_TEST (test_pad_probe_remove)
1253 pad = gst_pad_new ("src", GST_PAD_SRC);
1254 fail_unless (pad != NULL);
1256 gst_pad_set_active (pad, TRUE);
1257 fail_unless (pad->num_probes == 0);
1258 fail_unless (pad->num_blocked == 0);
1259 gst_pad_add_probe (pad,
1260 GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
1261 probe_remove_self_cb, NULL, probe_remove_notify_cb);
1262 fail_unless (pad->num_probes == 1);
1263 fail_unless (pad->num_blocked == 1);
1265 pad_probe_remove_notifiy_called = FALSE;
1266 gst_pad_push_event (pad, gst_event_new_stream_start ("asda"));
1268 fail_unless (pad->num_probes == 0);
1269 fail_unless (pad->num_blocked == 0);
1271 gst_object_unref (pad);
1281 } BlockReplaceProbeHelper;
1284 unblock_probe_thread (gpointer user_data)
1286 BlockReplaceProbeHelper *helper = user_data;
1288 GST_INFO_OBJECT (helper->probe_pad, "removing probe to unblock pad");
1289 gst_pad_remove_probe (helper->probe_pad, helper->probe_id);
1293 static GstPadProbeReturn
1294 block_and_replace_buffer_probe_cb (GstPad * pad, GstPadProbeInfo * info,
1297 BlockReplaceProbeHelper *helper = user_data;
1299 GST_INFO_OBJECT (pad, "about to block pad, replacing buffer");
1301 /* we want to block, but also drop this buffer */
1302 gst_buffer_unref (GST_BUFFER (info->data));
1306 g_thread_new ("gst-pad-test-thread", unblock_probe_thread, helper);
1308 return GST_PAD_PROBE_OK;
1311 GST_START_TEST (test_pad_probe_block_and_drop_buffer)
1313 BlockReplaceProbeHelper helper;
1317 src = gst_pad_new ("src", GST_PAD_SRC);
1318 gst_pad_set_active (src, TRUE);
1319 sink = gst_pad_new ("sink", GST_PAD_SINK);
1320 gst_pad_set_chain_function (sink, gst_check_chain_func);
1321 gst_pad_set_active (sink, TRUE);
1323 fail_unless (gst_pad_push_event (src,
1324 gst_event_new_stream_start ("test")) == TRUE);
1325 fail_unless (gst_pad_push_event (src,
1326 gst_event_new_segment (&dummy_segment)) == TRUE);
1328 fail_unless_equals_int (gst_pad_link (src, sink), GST_PAD_LINK_OK);
1330 helper.probe_id = gst_pad_add_probe (src,
1331 GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER,
1332 block_and_replace_buffer_probe_cb, &helper, NULL);
1333 helper.probe_pad = src;
1335 /* push a buffer so the events are propagated downstream */
1336 flow = gst_pad_push (src, gst_buffer_new ());
1338 g_thread_join (helper.thread);
1340 fail_unless_equals_int (flow, GST_FLOW_OK);
1342 /* no buffer should have made it through to the sink pad, and especially
1343 * not a NULL pointer buffer */
1344 fail_if (buffers && buffers->data == NULL);
1345 fail_unless (buffers == NULL);
1347 gst_object_unref (src);
1348 gst_object_unref (sink);
1353 static GstPadProbeReturn
1354 probe_block_a (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1356 return GST_PAD_PROBE_OK;
1359 static GstPadProbeReturn
1360 probe_block_b (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1362 gboolean *probe_b_called = user_data;
1364 *probe_b_called = TRUE;
1366 return GST_PAD_PROBE_OK;
1369 static GstPadProbeReturn
1370 probe_block_c (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1372 gboolean *probe_c_called = user_data;
1374 *probe_c_called = TRUE;
1376 return GST_PAD_PROBE_REMOVE;
1379 GST_START_TEST (test_pad_probe_block_add_remove)
1383 gulong probe_a, probe_b;
1384 gboolean probe_b_called = FALSE;
1385 gboolean probe_c_called = FALSE;
1387 pad = gst_pad_new ("src", GST_PAD_SRC);
1388 fail_unless (pad != NULL);
1390 gst_pad_set_active (pad, TRUE);
1391 fail_unless (pad->num_probes == 0);
1392 fail_unless (pad->num_blocked == 0);
1394 fail_unless (gst_pad_push_event (pad,
1395 gst_event_new_stream_start ("test")) == TRUE);
1396 fail_unless (gst_pad_push_event (pad,
1397 gst_event_new_segment (&dummy_segment)) == TRUE);
1399 probe_a = gst_pad_add_probe (pad,
1400 GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER,
1401 probe_block_a, NULL, NULL);
1403 fail_unless (pad->num_probes == 1);
1404 fail_unless (pad->num_blocked == 1);
1406 thread = g_thread_try_new ("gst-check", (GThreadFunc) push_buffer_async,
1409 /* wait for the block */
1410 while (!gst_pad_is_blocking (pad)) {
1414 probe_b = gst_pad_add_probe (pad,
1415 GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER,
1416 probe_block_b, &probe_b_called, NULL);
1418 gst_pad_remove_probe (pad, probe_a);
1420 /* wait for the callback */
1421 while (!probe_b_called) {
1425 /* wait for the block */
1426 while (!gst_pad_is_blocking (pad)) {
1430 gst_pad_add_probe (pad,
1431 GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER,
1432 probe_block_c, &probe_c_called, NULL);
1434 gst_pad_remove_probe (pad, probe_b);
1436 /* wait for the callback */
1437 while (!probe_c_called) {
1441 /* wait for the unblock */
1442 while (gst_pad_is_blocking (pad)) {
1446 gst_object_unref (pad);
1448 g_thread_join (thread);
1453 static gboolean src_flush_start_probe_called = FALSE;
1454 static gboolean src_flush_stop_probe_called = FALSE;
1455 static gboolean sink_flush_start_probe_called = FALSE;
1456 static gboolean sink_flush_stop_probe_called = FALSE;
1458 static GstPadProbeReturn
1459 flush_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1463 if (!(GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_EVENT_FLUSH))
1466 event = gst_pad_probe_info_get_event (info);
1467 switch (GST_EVENT_TYPE (event)) {
1468 case GST_EVENT_FLUSH_START:
1469 if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC)
1470 src_flush_start_probe_called = TRUE;
1472 sink_flush_start_probe_called = TRUE;
1474 case GST_EVENT_FLUSH_STOP:
1475 if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC)
1476 src_flush_stop_probe_called = TRUE;
1478 sink_flush_stop_probe_called = TRUE;
1485 return GST_PAD_PROBE_OK;
1488 GST_START_TEST (test_pad_probe_flush_events)
1492 src = gst_pad_new ("src", GST_PAD_SRC);
1493 sink = gst_pad_new ("sink", GST_PAD_SINK);
1494 gst_pad_set_chain_function (sink, gst_check_chain_func);
1495 gst_pad_set_active (src, TRUE);
1496 gst_pad_set_active (sink, TRUE);
1498 fail_unless (gst_pad_push_event (src,
1499 gst_event_new_stream_start ("test")) == TRUE);
1500 fail_unless (gst_pad_push_event (src,
1501 gst_event_new_segment (&dummy_segment)) == TRUE);
1503 fail_unless (gst_pad_link (src, sink) == GST_PAD_LINK_OK);
1505 gst_pad_add_probe (src,
1506 GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
1507 GST_PAD_PROBE_TYPE_EVENT_FLUSH, flush_probe_cb, NULL, NULL);
1508 gst_pad_add_probe (sink,
1509 GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
1510 GST_PAD_PROBE_TYPE_EVENT_FLUSH, flush_probe_cb, NULL, NULL);
1512 gst_pad_push_event (src, gst_event_new_flush_start ());
1513 gst_pad_push_event (src, gst_event_new_flush_stop (TRUE));
1515 fail_unless (gst_pad_push_event (src,
1516 gst_event_new_segment (&dummy_segment)) == TRUE);
1518 /* push a buffer so the events are propagated downstream */
1519 gst_pad_push (src, gst_buffer_new ());
1521 fail_unless (src_flush_start_probe_called);
1522 fail_unless (src_flush_stop_probe_called);
1523 fail_unless (sink_flush_start_probe_called);
1524 fail_unless (sink_flush_stop_probe_called);
1526 gst_object_unref (src);
1527 gst_object_unref (sink);
1532 static gboolean got_notify;
1535 caps_notify (GstPad * pad, GParamSpec * spec, gpointer data)
1541 test_queue_src_caps_notify (gboolean link_queue)
1544 GstPad *src, *sink, *another_pad;
1547 queue = gst_element_factory_make ("queue", NULL);
1548 fail_unless (queue != NULL);
1550 src = gst_element_get_static_pad (queue, "src");
1551 fail_unless (src != NULL);
1553 sink = gst_element_get_static_pad (queue, "sink");
1554 fail_unless (sink != NULL);
1557 another_pad = gst_pad_new ("sink", GST_PAD_SINK);
1558 fail_unless (another_pad != NULL);
1559 gst_pad_set_active (another_pad, TRUE);
1561 gst_pad_link_full (src, another_pad, GST_PAD_LINK_CHECK_NOTHING);
1566 gst_element_set_state (queue, GST_STATE_PLAYING);
1570 g_signal_connect (src, "notify::caps", G_CALLBACK (caps_notify), NULL);
1572 caps = gst_caps_from_string ("caps");
1573 gst_pad_send_event (sink, gst_event_new_caps (caps));
1574 gst_caps_unref (caps);
1576 while (got_notify == FALSE)
1579 gst_element_set_state (queue, GST_STATE_NULL);
1581 gst_object_unref (src);
1582 gst_object_unref (sink);
1583 gst_object_unref (queue);
1585 gst_object_unref (another_pad);
1589 GST_START_TEST (test_queue_src_caps_notify_linked)
1591 test_queue_src_caps_notify (TRUE);
1595 GST_START_TEST (test_queue_src_caps_notify_not_linked)
1597 /* This test will fail because queue doesn't set the caps
1598 on src pad unless it is linked */
1599 test_queue_src_caps_notify (FALSE);
1606 block_async_second (GstPad * pad, gboolean blocked, gpointer user_data)
1608 gst_pad_set_blocked (pad, FALSE, unblock_async_cb, NULL, NULL);
1612 block_async_first (GstPad * pad, gboolean blocked, gpointer user_data)
1614 static int n_calls = 0;
1615 gboolean *bool_user_data = (gboolean *) user_data;
1618 /* we expect this callback to be called only once */
1619 g_warn_if_reached ();
1621 *bool_user_data = blocked;
1623 /* replace block_async_first with block_async_second so next time the pad is
1624 * blocked the latter should be called */
1625 gst_pad_set_blocked (pad, TRUE, block_async_second, NULL, NULL);
1627 /* unblock temporarily, in the next push block_async_second should be called
1629 gst_pad_push_event (pad, gst_event_new_flush_start ());
1632 GST_START_TEST (test_block_async_replace_callback)
1637 pad = gst_pad_new ("src", GST_PAD_SRC);
1638 fail_unless (pad != NULL);
1639 gst_pad_set_active (pad, TRUE);
1641 gst_pad_set_blocked (pad, TRUE, block_async_first, &blocked, NULL);
1644 gst_pad_push (pad, gst_buffer_new ());
1645 fail_unless (blocked == TRUE);
1646 /* block_async_first flushes to unblock */
1647 gst_pad_push_event (pad, gst_event_new_flush_stop ());
1649 /* push again, this time block_async_second should be called */
1650 gst_pad_push (pad, gst_buffer_new ());
1651 fail_unless (blocked == TRUE);
1653 gst_object_unref (pad);
1660 block_async_full_destroy (gpointer user_data)
1662 gint *state = (gint *) user_data;
1664 fail_unless (*state < 2);
1666 GST_DEBUG ("setting state to 2");
1670 static GstPadProbeReturn
1671 block_async_full_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
1673 *(gint *) user_data = (gint) TRUE;
1675 gst_pad_push_event (pad, gst_event_new_flush_start ());
1676 GST_DEBUG ("setting state to 1");
1678 return GST_PAD_PROBE_OK;
1681 GST_START_TEST (test_block_async_full_destroy)
1684 /* 0 = unblocked, 1 = blocked, 2 = destroyed */
1688 pad = gst_pad_new ("src", GST_PAD_SRC);
1689 fail_unless (pad != NULL);
1690 gst_pad_set_active (pad, TRUE);
1692 fail_unless (gst_pad_push_event (pad,
1693 gst_event_new_stream_start ("test")) == TRUE);
1694 fail_unless (gst_pad_push_event (pad,
1695 gst_event_new_segment (&dummy_segment)) == TRUE);
1697 id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_full_cb,
1698 &state, block_async_full_destroy);
1699 fail_unless (state == 0);
1701 gst_pad_push (pad, gst_buffer_new ());
1702 /* block_async_full_cb sets state to 1 and then flushes to unblock temporarily
1704 fail_unless (state == 1);
1705 gst_pad_push_event (pad, gst_event_new_flush_stop (TRUE));
1707 /* unblock callback is called */
1708 gst_pad_remove_probe (pad, id);
1709 fail_unless (state == 2);
1711 gst_object_unref (pad);
1716 GST_START_TEST (test_block_async_full_destroy_dispose)
1719 /* 0 = unblocked, 1 = blocked, 2 = destroyed */
1722 pad = gst_pad_new ("src", GST_PAD_SRC);
1723 fail_unless (pad != NULL);
1724 gst_pad_set_active (pad, TRUE);
1726 fail_unless (gst_pad_push_event (pad,
1727 gst_event_new_stream_start ("test")) == TRUE);
1728 fail_unless (gst_pad_push_event (pad,
1729 gst_event_new_segment (&dummy_segment)) == TRUE);
1731 (void) gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_full_cb,
1732 &state, block_async_full_destroy);
1734 gst_pad_push (pad, gst_buffer_new ());
1735 /* block_async_full_cb sets state to 1 and then flushes to unblock temporarily
1737 fail_unless_equals_int (state, 1);
1738 gst_pad_push_event (pad, gst_event_new_flush_stop (TRUE));
1740 /* gst_BLOCK calls the destroy_notify function if necessary */
1741 gst_object_unref (pad);
1743 fail_unless_equals_int (state, 2);
1751 unblock_async_no_flush_cb (GstPad * pad, gboolean blocked, gpointer user_data)
1753 gboolean *bool_user_data = (gboolean *) user_data;
1755 /* here we should have blocked == 1 unblocked == 0 */
1757 fail_unless (blocked == FALSE);
1759 fail_unless (bool_user_data[0] == TRUE);
1760 fail_unless (bool_user_data[1] == TRUE);
1761 fail_unless (bool_user_data[2] == FALSE);
1763 bool_user_data[2] = TRUE;
1770 unblock_async_not_called (GstPad * pad, gboolean blocked, gpointer user_data)
1772 g_warn_if_reached ();
1776 static GstPadProbeReturn
1777 block_async_second_no_flush (GstPad * pad, GstPadProbeInfo * info,
1780 gboolean *bool_user_data = (gboolean *) user_data;
1782 GST_DEBUG ("second probe called");
1784 fail_unless (info->type & GST_PAD_PROBE_TYPE_BLOCK);
1786 fail_unless (bool_user_data[0] == TRUE);
1787 fail_unless (bool_user_data[1] == FALSE);
1788 fail_unless (bool_user_data[2] == FALSE);
1790 bool_user_data[1] = TRUE;
1792 GST_DEBUG ("removing second probe with id %lu", id);
1793 gst_pad_remove_probe (pad, id);
1795 return GST_PAD_PROBE_OK;
1798 static GstPadProbeReturn
1799 block_async_first_no_flush (GstPad * pad, GstPadProbeInfo * info,
1802 static int n_calls = 0;
1803 gboolean *bool_user_data = (gboolean *) user_data;
1805 fail_unless (info->type & GST_PAD_PROBE_TYPE_BLOCK);
1807 GST_DEBUG ("first probe called");
1810 /* we expect this callback to be called only once */
1811 g_warn_if_reached ();
1813 *bool_user_data = TRUE;
1815 fail_unless (bool_user_data[0] == TRUE);
1816 fail_unless (bool_user_data[1] == FALSE);
1817 fail_unless (bool_user_data[2] == FALSE);
1819 GST_DEBUG ("removing first probe with id %lu", id);
1820 gst_pad_remove_probe (pad, id);
1822 GST_DEBUG ("adding second probe");
1823 /* replace block_async_first with block_async_second so next time the pad is
1824 * blocked the latter should be called */
1825 id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK,
1826 block_async_second_no_flush, user_data, NULL);
1827 GST_DEBUG ("added probe with id %lu", id);
1829 return GST_PAD_PROBE_OK;
1832 GST_START_TEST (test_block_async_replace_callback_no_flush)
1835 gboolean bool_user_data[3] = { FALSE, FALSE, FALSE };
1837 pad = gst_pad_new ("src", GST_PAD_SRC);
1838 fail_unless (pad != NULL);
1839 gst_pad_set_active (pad, TRUE);
1841 fail_unless (gst_pad_push_event (pad,
1842 gst_event_new_stream_start ("test")) == TRUE);
1843 fail_unless (gst_pad_push_event (pad,
1844 gst_event_new_segment (&dummy_segment)) == TRUE);
1846 GST_DEBUG ("adding probe");
1847 id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK,
1848 block_async_first_no_flush, bool_user_data, NULL);
1849 GST_DEBUG ("added probe with id %lu", id);
1852 GST_DEBUG ("pushing buffer");
1853 gst_pad_push (pad, gst_buffer_new ());
1854 fail_unless (bool_user_data[0] == TRUE);
1855 fail_unless (bool_user_data[1] == TRUE);
1856 fail_unless (bool_user_data[2] == FALSE);
1858 gst_object_unref (pad);
1863 static gint sticky_count;
1866 test_sticky_events_handler (GstPad * pad, GstObject * parent, GstEvent * event)
1868 GST_DEBUG_OBJECT (pad, "received event %" GST_PTR_FORMAT, event);
1870 switch (sticky_count) {
1872 fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START);
1879 fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CAPS);
1881 gst_event_parse_caps (event, &caps);
1882 fail_unless (gst_caps_get_size (caps) == 1);
1883 s = gst_caps_get_structure (caps, 0);
1884 fail_unless (gst_structure_has_name (s, "foo/baz"));
1888 fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
1891 fail_unless (FALSE);
1895 gst_event_unref (event);
1901 static GstFlowReturn
1902 test_sticky_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
1904 gst_buffer_unref (buffer);
1908 GST_START_TEST (test_sticky_events)
1910 GstPad *srcpad, *sinkpad;
1915 /* make unlinked srcpad */
1916 srcpad = gst_pad_new ("src", GST_PAD_SRC);
1917 fail_unless (srcpad != NULL);
1918 gst_pad_set_active (srcpad, TRUE);
1920 /* test stream-start */
1921 fail_unless (gst_pad_get_stream_id (srcpad) == NULL);
1923 /* push an event, it should be sticky on the srcpad */
1924 fail_unless (gst_pad_push_event (srcpad,
1925 gst_event_new_stream_start ("test")) == TRUE);
1927 /* let's see if it stuck */
1928 id = gst_pad_get_stream_id (srcpad);
1929 fail_unless_equals_string (id, "test");
1932 /* make a caps event */
1933 caps = gst_caps_new_empty_simple ("foo/bar");
1934 gst_pad_push_event (srcpad, gst_event_new_caps (caps));
1935 gst_caps_unref (caps);
1937 /* make segment event */
1938 gst_segment_init (&seg, GST_FORMAT_TIME);
1939 gst_pad_push_event (srcpad, gst_event_new_segment (&seg));
1941 /* now make a sinkpad */
1942 sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
1943 fail_unless (sinkpad != NULL);
1945 gst_pad_set_event_function (sinkpad, test_sticky_events_handler);
1946 gst_pad_set_chain_function (sinkpad, test_sticky_chain);
1947 fail_unless (sticky_count == 0);
1948 gst_pad_set_active (sinkpad, TRUE);
1951 gst_pad_link (srcpad, sinkpad);
1952 /* should not trigger events */
1953 fail_unless (sticky_count == 0);
1955 /* caps replaces old caps event at position 2, the pushes all
1957 caps = gst_caps_new_empty_simple ("foo/baz");
1958 gst_pad_push_event (srcpad, gst_event_new_caps (caps));
1959 gst_caps_unref (caps);
1961 /* should have triggered 2 events, the segment event is still pending */
1962 fail_unless_equals_int (sticky_count, 2);
1964 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_OK);
1966 /* should have triggered 3 events */
1967 fail_unless_equals_int (sticky_count, 3);
1969 gst_object_unref (srcpad);
1970 gst_object_unref (sinkpad);
1975 static GstFlowReturn next_return;
1977 static GstFlowReturn
1978 test_lastflow_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
1980 gst_buffer_unref (buffer);
1984 GST_START_TEST (test_last_flow_return_push)
1986 GstPad *srcpad, *sinkpad;
1989 srcpad = gst_pad_new ("src", GST_PAD_SRC);
1990 fail_unless (srcpad != NULL);
1991 sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
1992 fail_unless (sinkpad != NULL);
1993 gst_pad_set_chain_function (sinkpad, test_lastflow_chain);
1994 gst_pad_link (srcpad, sinkpad);
1996 /* initial value is flushing */
1997 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_FLUSHING);
1999 /* when active it goes to ok */
2000 gst_pad_set_active (srcpad, TRUE);
2001 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_OK);
2002 gst_pad_set_active (sinkpad, TRUE);
2004 /* startup events */
2005 gst_pad_push_event (srcpad, gst_event_new_stream_start ("test"));
2006 gst_segment_init (&seg, GST_FORMAT_TIME);
2007 gst_pad_push_event (srcpad, gst_event_new_segment (&seg));
2011 next_return = GST_FLOW_OK;
2012 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_OK);
2013 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_OK);
2015 /* push not-linked */
2016 next_return = GST_FLOW_NOT_LINKED;
2017 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_NOT_LINKED);
2018 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_NOT_LINKED);
2020 /* push not-linked */
2021 next_return = GST_FLOW_NOT_NEGOTIATED;
2022 fail_unless (gst_pad_push (srcpad,
2023 gst_buffer_new ()) == GST_FLOW_NOT_NEGOTIATED);
2024 fail_unless (gst_pad_get_last_flow_return (srcpad) ==
2025 GST_FLOW_NOT_NEGOTIATED);
2028 next_return = GST_FLOW_ERROR;
2029 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_ERROR);
2030 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_ERROR);
2033 next_return = GST_FLOW_OK;
2034 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_OK);
2035 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_OK);
2038 gst_pad_unlink (srcpad, sinkpad);
2039 fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_NOT_LINKED);
2040 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_NOT_LINKED);
2042 gst_pad_link (srcpad, sinkpad);
2043 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
2044 fail_unless (gst_pad_get_last_flow_return (srcpad) == GST_FLOW_EOS);
2046 gst_object_unref (srcpad);
2047 gst_object_unref (sinkpad);
2052 static GstFlowReturn
2053 test_lastflow_getrange (GstPad * pad, GstObject * parent, guint64 offset,
2054 guint length, GstBuffer ** buf)
2056 if (next_return == GST_FLOW_OK)
2057 *buf = gst_buffer_new ();
2064 test_lastflow_activate_pull_func (GstPad * pad, GstObject * object)
2066 return gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE);
2069 GST_START_TEST (test_last_flow_return_pull)
2071 GstPad *srcpad, *sinkpad;
2072 GstBuffer *buf = NULL;
2074 srcpad = gst_pad_new ("src", GST_PAD_SRC);
2075 fail_unless (srcpad != NULL);
2076 sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
2077 fail_unless (sinkpad != NULL);
2078 gst_pad_set_getrange_function (srcpad, test_lastflow_getrange);
2079 gst_pad_set_activate_function (sinkpad, test_lastflow_activate_pull_func);
2080 gst_pad_link (srcpad, sinkpad);
2082 /* initial value is flushing */
2083 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_FLUSHING);
2085 /* when active it goes to ok */
2086 gst_pad_set_active (sinkpad, TRUE);
2087 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_OK);
2088 gst_pad_set_active (srcpad, TRUE);
2091 next_return = GST_FLOW_OK;
2092 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_OK);
2093 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_OK);
2094 gst_buffer_unref (buf);
2097 /* pull not-linked */
2098 next_return = GST_FLOW_NOT_LINKED;
2099 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_NOT_LINKED);
2100 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_NOT_LINKED);
2103 next_return = GST_FLOW_ERROR;
2104 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_ERROR);
2105 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_ERROR);
2108 next_return = GST_FLOW_NOT_NEGOTIATED;
2109 fail_unless (gst_pad_pull_range (sinkpad, 0, 1,
2110 &buf) == GST_FLOW_NOT_NEGOTIATED);
2111 fail_unless (gst_pad_get_last_flow_return (sinkpad) ==
2112 GST_FLOW_NOT_NEGOTIATED);
2115 next_return = GST_FLOW_OK;
2116 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_OK);
2117 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_OK);
2118 gst_buffer_unref (buf);
2122 gst_pad_unlink (srcpad, sinkpad);
2123 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_NOT_LINKED);
2124 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_NOT_LINKED);
2127 gst_pad_link (srcpad, sinkpad);
2128 next_return = GST_FLOW_EOS;
2129 fail_unless (gst_pad_pull_range (sinkpad, 0, 1, &buf) == GST_FLOW_EOS);
2130 fail_unless (gst_pad_get_last_flow_return (sinkpad) == GST_FLOW_EOS);
2132 gst_object_unref (srcpad);
2133 gst_object_unref (sinkpad);
2138 GST_START_TEST (test_flush_stop_inactive)
2140 GstPad *sinkpad, *srcpad;
2142 sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
2143 fail_unless (sinkpad != NULL);
2145 /* new pads are inactive and flushing */
2146 fail_if (GST_PAD_IS_ACTIVE (sinkpad));
2147 fail_unless (GST_PAD_IS_FLUSHING (sinkpad));
2149 /* this should fail, pad is inactive */
2150 fail_if (gst_pad_send_event (sinkpad, gst_event_new_flush_stop (FALSE)));
2152 /* nothing should have changed */
2153 fail_if (GST_PAD_IS_ACTIVE (sinkpad));
2154 fail_unless (GST_PAD_IS_FLUSHING (sinkpad));
2156 gst_pad_set_active (sinkpad, TRUE);
2158 /* pad is now active an not flushing anymore */
2159 fail_unless (GST_PAD_IS_ACTIVE (sinkpad));
2160 fail_if (GST_PAD_IS_FLUSHING (sinkpad));
2162 /* do flush, does not deactivate the pad */
2163 fail_unless (gst_pad_send_event (sinkpad, gst_event_new_flush_start ()));
2164 fail_unless (GST_PAD_IS_ACTIVE (sinkpad));
2165 fail_unless (GST_PAD_IS_FLUSHING (sinkpad));
2167 fail_unless (gst_pad_send_event (sinkpad, gst_event_new_flush_stop (FALSE)));
2168 fail_unless (GST_PAD_IS_ACTIVE (sinkpad));
2169 fail_if (GST_PAD_IS_FLUSHING (sinkpad));
2171 gst_pad_set_active (sinkpad, FALSE);
2172 fail_if (GST_PAD_IS_ACTIVE (sinkpad));
2173 fail_unless (GST_PAD_IS_FLUSHING (sinkpad));
2175 gst_object_unref (sinkpad);
2177 /* we should not be able to push on an inactive srcpad */
2178 srcpad = gst_pad_new ("src", GST_PAD_SRC);
2179 fail_unless (srcpad != NULL);
2181 fail_if (GST_PAD_IS_ACTIVE (srcpad));
2182 fail_unless (GST_PAD_IS_FLUSHING (srcpad));
2184 fail_if (gst_pad_push_event (srcpad, gst_event_new_flush_stop (FALSE)));
2186 /* should still be inactive and flushing */
2187 fail_if (GST_PAD_IS_ACTIVE (srcpad));
2188 fail_unless (GST_PAD_IS_FLUSHING (srcpad));
2190 gst_pad_set_active (srcpad, TRUE);
2192 /* pad is now active an not flushing anymore */
2193 fail_unless (GST_PAD_IS_ACTIVE (srcpad));
2194 fail_if (GST_PAD_IS_FLUSHING (srcpad));
2196 /* do flush, does not deactivate the pad */
2197 fail_if (gst_pad_push_event (srcpad, gst_event_new_flush_start ()));
2198 fail_unless (GST_PAD_IS_ACTIVE (srcpad));
2199 fail_unless (GST_PAD_IS_FLUSHING (srcpad));
2201 fail_if (gst_pad_push_event (srcpad, gst_event_new_flush_stop (FALSE)));
2202 fail_unless (GST_PAD_IS_ACTIVE (srcpad));
2203 fail_if (GST_PAD_IS_FLUSHING (srcpad));
2205 gst_pad_set_active (srcpad, FALSE);
2206 fail_if (GST_PAD_IS_ACTIVE (srcpad));
2207 fail_unless (GST_PAD_IS_FLUSHING (srcpad));
2209 gst_object_unref (srcpad);
2215 gst_pad_suite (void)
2217 Suite *s = suite_create ("GstPad");
2218 TCase *tc_chain = tcase_create ("general");
2220 /* turn off timeout */
2221 tcase_set_timeout (tc_chain, 60);
2223 gst_segment_init (&dummy_segment, GST_FORMAT_BYTES);
2225 suite_add_tcase (s, tc_chain);
2226 tcase_add_test (tc_chain, test_link);
2227 tcase_add_test (tc_chain, test_refcount);
2228 tcase_add_test (tc_chain, test_get_allowed_caps);
2229 tcase_add_test (tc_chain, test_sticky_caps_unlinked);
2230 tcase_add_test (tc_chain, test_sticky_caps_unlinked_incompatible);
2231 tcase_add_test (tc_chain, test_sticky_caps_flushing);
2232 tcase_add_test (tc_chain, test_link_unlink_threaded);
2233 tcase_add_test (tc_chain, test_name_is_valid);
2234 tcase_add_test (tc_chain, test_push_unlinked);
2235 tcase_add_test (tc_chain, test_push_linked);
2236 tcase_add_test (tc_chain, test_push_linked_flushing);
2237 tcase_add_test (tc_chain, test_push_buffer_list_compat);
2238 tcase_add_test (tc_chain, test_flowreturn);
2239 tcase_add_test (tc_chain, test_push_negotiation);
2240 tcase_add_test (tc_chain, test_src_unref_unlink);
2241 tcase_add_test (tc_chain, test_sink_unref_unlink);
2242 tcase_add_test (tc_chain, test_block_async);
2243 tcase_add_test (tc_chain, test_pad_blocking_with_probe_type_block);
2244 tcase_add_test (tc_chain, test_pad_blocking_with_probe_type_blocking);
2245 tcase_add_test (tc_chain, test_pad_blocking_with_probe_type_idle);
2246 tcase_add_test (tc_chain, test_pad_probe_remove);
2247 tcase_add_test (tc_chain, test_pad_probe_block_add_remove);
2248 tcase_add_test (tc_chain, test_pad_probe_block_and_drop_buffer);
2249 tcase_add_test (tc_chain, test_pad_probe_flush_events);
2250 tcase_add_test (tc_chain, test_queue_src_caps_notify_linked);
2251 tcase_add_test (tc_chain, test_queue_src_caps_notify_not_linked);
2253 tcase_add_test (tc_chain, test_block_async_replace_callback);
2255 tcase_add_test (tc_chain, test_block_async_full_destroy);
2256 tcase_add_test (tc_chain, test_block_async_full_destroy_dispose);
2257 tcase_add_test (tc_chain, test_block_async_replace_callback_no_flush);
2258 tcase_add_test (tc_chain, test_sticky_events);
2259 tcase_add_test (tc_chain, test_last_flow_return_push);
2260 tcase_add_test (tc_chain, test_last_flow_return_pull);
2261 tcase_add_test (tc_chain, test_flush_stop_inactive);
2266 GST_CHECK_MAIN (gst_pad);