ret = gst_element_set_state (sink, GST_STATE_PAUSED);
fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* send segment */
{
GstEvent *event;
ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* send segment */
{
GstEvent *event;
fail_unless (eret == TRUE);
}
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* send segment, this should now work again */
{
GstEvent *event;
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* send segment, this should work */
{
GstEvent *event;
qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
fail_unless (qret == FALSE);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* send segment, this should work */
{
GstSegment segment;
gst_query_unref (seeking_query);
#endif
+ fail_unless (gst_pad_push_event (mysrcpad,
+ gst_event_new_stream_start ("test")));
+
gst_segment_init (&segment, GST_FORMAT_BYTES);
fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
static void
setup_test_objects (struct TestData *td, GstPadChainFunction chain_func)
{
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
td->mycaps = gst_caps_new_empty_simple ("test/test");
td->funnel = gst_element_factory_make ("funnel", NULL);
td->mysink = gst_pad_new ("sink", GST_PAD_SINK);
gst_pad_set_chain_function (td->mysink, chain_func);
gst_pad_set_active (td->mysink, TRUE);
- gst_pad_set_caps (td->mysink, td->mycaps);
td->mysrc1 = gst_pad_new ("src1", GST_PAD_SRC);
gst_pad_set_active (td->mysrc1, TRUE);
+
+ gst_pad_push_event (td->mysrc1, gst_event_new_stream_start ("test"));
gst_pad_set_caps (td->mysrc1, td->mycaps);
+ gst_pad_push_event (td->mysrc1, gst_event_new_segment (&segment));
td->mysrc2 = gst_pad_new ("src2", GST_PAD_SRC);
gst_pad_set_active (td->mysrc2, TRUE);
+ gst_pad_push_event (td->mysrc2, gst_event_new_stream_start ("test"));
gst_pad_set_caps (td->mysrc2, td->mycaps);
+ gst_pad_push_event (td->mysrc2, gst_event_new_segment (&segment));
fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (td->funnelsrc,
td->mysink)));
GST_START_TEST (test_funnel_eos)
{
struct TestData td;
+ GstSegment segment;
setup_test_objects (&td, chain_ok);
fail_unless (gst_pad_push_event (td.mysrc1, gst_event_new_flush_start ()));
fail_unless (gst_pad_push_event (td.mysrc1, gst_event_new_flush_stop (TRUE)));
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_push_event (td.mysrc1, gst_event_new_segment (&segment));
+ gst_pad_push_event (td.mysrc2, gst_event_new_segment (&segment));
+
fail_unless (gst_pad_push (td.mysrc1, gst_buffer_new ()) == GST_FLOW_OK);
fail_unless (gst_pad_push (td.mysrc2, gst_buffer_new ()) == GST_FLOW_EOS);
{
Suite *s = suite_create ("funnel");
TCase *tc_chain;
- GLogLevelFlags fatal_mask;
-
- fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
- fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
- g_log_set_always_fatal (fatal_mask);
tc_chain = tcase_create ("funnel simple");
tcase_add_test (tc_chain, test_funnel_simple);
{
if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
have_eos = TRUE;
- gst_event_unref (event);
- return TRUE;
}
gst_event_unref (event);
- return FALSE;
+ return TRUE;
}
static GstElement *
{
GstElement *identity;
GstBuffer *buffer;
+ GstSegment segment;
identity = setup_identity ();
fail_unless (gst_element_set_state (identity,
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
+ gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
+
buffer = gst_buffer_new_and_alloc (4);
ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
gint i;
const gint NPADS = 5;
const gint NBUFFERS = 1000;
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
g_mutex_init (&mutex);
g_cond_init (&cond);
gst_pad_set_active (inputpads[i], TRUE);
+ gst_pad_push_event (inputpads[i], gst_event_new_stream_start ("test"));
+ gst_pad_push_event (inputpads[i], gst_event_new_segment (&segment));
+
mq_srcpad = mq_sinkpad_to_srcpad (mq, mq_sinkpad);
name = g_strdup_printf ("dummysink%d", i);
"extra-size-bytes", (guint) 0,
"extra-size-buffers", (guint) 0, "extra-size-time", (guint64) 0, NULL);
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
/* Construct 2 dummy output pads. */
for (i = 0; i < 2; i++) {
GstPad *mq_srcpad, *mq_sinkpad;
gst_pad_set_active (inputpads[i], TRUE);
+ gst_pad_push_event (inputpads[i], gst_event_new_stream_start ("test"));
+ gst_pad_push_event (inputpads[i], gst_event_new_segment (&segment));
+
mq_srcpad = mq_sinkpad_to_srcpad (mq, mq_sinkpad);
name = g_strdup_printf ("dummysink%d", i);
gst_element_set_state (pipe, GST_STATE_PLAYING);
- /* Push 2 new segment events */
- gst_segment_init (&segment, GST_FORMAT_TIME);
- event = gst_event_new_segment (&segment);
- gst_pad_push_event (inputpads[0], gst_event_ref (event));
- gst_pad_push_event (inputpads[1], event);
-
for (i = 0; i < NBUFFERS; i++) {
GstBuffer *buf;
GstFlowReturn ret;
GstBuffer *buffer2;
GstBuffer *buffer3;
GstBuffer *buffer;
+ GstSegment segment;
g_signal_connect (queue, "overrun",
G_CALLBACK (queue_overrun_link_and_activate), NULL);
UNDERRUN_WAIT ();
UNDERRUN_UNLOCK ();
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
+ gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
fail_unless (underrun_count == 1);
fail_unless (overrun_count == 0);
GstBuffer *buffer2;
GstBuffer *buffer3;
GstBuffer *buffer;
+ GstSegment segment;
g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
g_object_set (G_OBJECT (queue), "max-size-buffers", 2, "leaky", 1, NULL);
UNDERRUN_WAIT ();
UNDERRUN_UNLOCK ();
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
+ gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
fail_unless (overrun_count == 0);
fail_unless (underrun_count == 1);
GstBuffer *buffer2;
GstBuffer *buffer3;
GstBuffer *buffer;
+ GstSegment segment;
g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
g_object_set (G_OBJECT (queue), "max-size-buffers", 2, "leaky", 2, NULL);
UNDERRUN_WAIT ();
UNDERRUN_UNLOCK ();
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
+ gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
fail_unless (overrun_count == 0);
fail_unless (underrun_count == 1);
{
GstBuffer *buffer = NULL;
GstClockTime time;
+ GstSegment segment;
g_signal_connect (queue, "overrun",
G_CALLBACK (queue_overrun_link_and_activate), NULL);
UNDERRUN_WAIT ();
UNDERRUN_UNLOCK ();
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
+ gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
/* push buffer without duration */
buffer = gst_buffer_new_and_alloc (4);
GstBuffer *buffer;
GstPad *sinkpad, *srcpad;
GThread *thread;
+ GstSegment segment;
queue2 = gst_element_factory_make ("queue2", NULL);
sinkpad = gst_element_get_static_pad (queue2, "sink");
gst_pad_activate_mode (srcpad, GST_PAD_MODE_PULL, TRUE);
gst_element_set_state (queue2, GST_STATE_PLAYING);
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+ gst_pad_send_event (sinkpad, gst_event_new_segment (&segment));
+
/* fill up the buffer */
buffer = gst_buffer_new_and_alloc (4 * 1024);
fail_unless (gst_pad_chain (sinkpad, buffer) == GST_FLOW_OK);
count++;
g_object_set_data (G_OBJECT (pad), count_type, GINT_TO_POINTER (count));
- /* drop everything */
- return GST_PAD_PROBE_DROP;
+ /* drop every buffer */
+ return GST_IS_BUFFER (obj) ? GST_PAD_PROBE_DROP : GST_PAD_PROBE_PASS;
}
/* Create and link output pad: selector:src%d ! output_pad */
for (l = input_pads; l; l = l->next) {
GstPad *pad = l->data;
+ gst_pad_push_event (pad, gst_event_new_stream_start ("test"));
gst_pad_push_event (pad, gst_event_new_segment (&seg));
}
}
GstElement * elem, GList * peer_pads, gint num_buffers)
{
GstBuffer *buf = NULL;
- GstCaps *caps = NULL;
GList *l = peer_pads;
GstPad *selpad = NULL;
/* setup dummy buffer */
- caps = gst_caps_from_string ("application/x-unknown");
buf = gst_buffer_new_and_alloc (1);
while (l != NULL) {
/* cleanup buffer */
gst_buffer_unref (buf);
- gst_caps_unref (caps);
}
/* Create output-selector with given number of src pads and switch
GstPad *teesink, *teesrc1, *teesrc2;
GstElement *tee;
GstBuffer *buffer;
+ GstSegment segment;
GstCaps *caps;
caps = gst_caps_new_empty_simple ("test/test");
mysink1 = gst_pad_new ("mysink1", GST_PAD_SINK);
gst_pad_set_chain_function (mysink1, _fake_chain);
gst_pad_set_active (mysink1, TRUE);
- gst_pad_set_caps (mysink1, caps);
GST_DEBUG ("Creating mysink2");
mysink2 = gst_pad_new ("mysink2", GST_PAD_SINK);
gst_pad_set_chain_function (mysink2, _fake_chain);
gst_pad_set_active (mysink2, TRUE);
- gst_pad_set_caps (mysink2, caps);
GST_DEBUG ("Creating mysrc");
mysrc = gst_pad_new ("mysrc", GST_PAD_SRC);
gst_pad_set_active (mysrc, TRUE);
- gst_pad_set_caps (mysrc, caps);
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_push_event (mysrc, gst_event_new_stream_start ("test"));
+ gst_pad_set_caps (mysrc, caps);
+ gst_pad_push_event (mysrc, gst_event_new_segment (&segment));
fail_unless (gst_pad_link (mysrc, teesink) == GST_PAD_LINK_OK);
fail_unless (gst_pad_link (teesrc1, mysink1) == GST_PAD_LINK_OK);
GST_DEBUG ("Trying to push with mysink2 disabled");
gst_pad_set_active (mysink1, FALSE);
gst_pad_set_active (mysink2, TRUE);
- gst_pad_set_caps (mysink2, caps);
fail_unless (gst_pad_push (mysrc,
gst_buffer_ref (buffer)) == GST_FLOW_FLUSHING);
/* Test if everything still works in normal state */
GST_DEBUG ("Reactivate both pads and try pushing");
gst_pad_set_active (mysink1, TRUE);
- gst_pad_set_caps (mysink1, caps);
gst_pad_set_active (mysink2, TRUE);
- gst_pad_set_caps (mysink2, caps);
fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
/* One unlinked pad must return OK, two unlinked pads must return NOT_LINKED */
GstPad *sinkpad;
GstFlowReturn res;
GThread *thread;
+ GstSegment segment;
pipeline = gst_pipeline_new ("pipeline");
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+ gst_pad_send_event (sinkpad, gst_event_new_segment (&segment));
+
/* push buffer of 100 seconds, since it has a timestamp of 0, it should be
* rendered immediately and the chain function should return immediately */
buffer = gst_buffer_new_and_alloc (10);
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) async_done_func, sink,
NULL);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+
/* make newsegment, this sets the position to 10sec when the buffer prerolls */
GST_DEBUG ("sending segment");
gst_segment_init (&segment, GST_FORMAT_TIME);
{
GstPad *sinkpad;
GstPad *srcpad;
+ GstSegment segment;
bin = gst_bin_new (NULL);
gst_element_set_state (bin, GST_STATE_PLAYING);
gst_pad_set_active (srcpad, TRUE);
gst_pad_link (srcpad, ghostsink);
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ fail_unless (gst_pad_push_event (srcpad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (srcpad,
+ gst_event_new_segment (&segment)) == TRUE);
+
gst_pad_add_probe (ghostsrc, GST_PAD_PROBE_TYPE_BUFFER,
remove_ghostpad_probe_cb, NULL, NULL);
#include <gst/check/gstcheck.h>
+static GstSegment dummy_segment;
+
GST_START_TEST (test_link)
{
GstPad *src, *sink;
{
GstCaps *caps;
- fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CAPS);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CAPS
+ || GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START
+ || GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS)
+ return TRUE;
/* Ensure we get here just once: */
fail_unless (event_caps == NULL);
gst_object_unref (src_template);
gst_object_unref (sink_template);
+ gst_pad_set_active (src, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+
caps = gst_caps_from_string ("foo/bar, dummy=(int)1");
ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
event = gst_event_new_caps (caps);
- gst_pad_set_active (src, TRUE);
fail_unless (gst_pad_push_event (src, event) == TRUE);
fail_unless (event_caps == NULL);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
/* Linking and activating will not forward the sticky event yet... */
fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (src, sink)));
gst_pad_set_active (sink, TRUE);
gst_object_unref (src_template);
gst_object_unref (sink_template);
+ gst_pad_set_active (src, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+
failcaps = gst_caps_from_string ("pony/express, failure=(boolean)true");
ASSERT_CAPS_REFCOUNT (failcaps, "caps", 1);
event = gst_event_new_caps (failcaps);
gst_caps_unref (failcaps);
- gst_pad_set_active (src, TRUE);
/* The pad isn't linked yet, and anything matches the source pad template
* (which is ANY) */
fail_unless (gst_pad_push_event (src, event) == TRUE);
fail_unless (event_caps == NULL);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
/* Linking and activating will not forward the sticky event yet... */
fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (src, sink)));
gst_pad_set_active (sink, TRUE);
ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
event = gst_event_new_caps (caps);
+
gst_pad_set_active (src, TRUE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
/* The caps event gets accepted by the source pad (and stored) */
fail_unless (gst_pad_push_event (src, event) == TRUE);
/* But wasn't forwarded since the sink pad is flushing (not activated) */
fail_unless (event_caps == NULL);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
/* Activating will not forward the sticky event yet... */
gst_pad_set_active (sink, TRUE);
fail_unless (event_caps == NULL);
gst_buffer_unref (buffer);
gst_pad_set_active (src, TRUE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
GST_DEBUG ("push caps event inactive");
gst_pad_set_caps (src, caps);
ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
/* pushing on an unlinked pad will drop the buffer */
GST_DEBUG ("push buffer unlinked");
ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
gst_pad_set_active (src, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+
gst_pad_set_caps (src, caps);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
gst_pad_set_active (sink, TRUE);
- gst_pad_set_caps (sink, caps);
/* one for me and one for each set_caps */
- ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
plr = gst_pad_link (src, sink);
fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
- ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
buffer = gst_buffer_new ();
ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
gst_pad_set_active (src, TRUE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
gst_pad_set_caps (src, caps);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
/* need to activate to make it accept the caps */
gst_pad_set_active (sink, TRUE);
- gst_pad_set_caps (sink, caps);
/* one for me and one for each set_caps */
- ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
plr = gst_pad_link (src, sink);
fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
- ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
/* not activating the pads here, which keeps them flushing */
gst_pad_set_active (src, FALSE);
gst_pad_set_active (src, TRUE);
gst_pad_set_active (sink, FALSE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+ gst_pad_set_caps (src, caps);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
/* adding a probe that returns FALSE will drop the buffer without trying
* to chain */
id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER, _probe_handler,
GINT_TO_POINTER (0), NULL);
buffer = gst_buffer_new ();
gst_buffer_ref (buffer);
- fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_FLUSHING);
ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
fail_unless_equals_int (g_list_length (buffers), 0);
gst_buffer_unref (buffer);
gst_pad_remove_probe (src, id);
/* cleanup */
- ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
ASSERT_OBJECT_REFCOUNT (src, "src", 1);
gst_pad_link (src, sink);
gst_object_unref (src);
caps = gst_caps_from_string ("foo/bar");
gst_pad_set_active (src, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+
gst_pad_set_caps (src, caps);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
gst_pad_set_active (sink, TRUE);
- gst_pad_set_caps (sink, caps);
plr = gst_pad_link (src, sink);
fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
fail_unless (pad != NULL);
gst_pad_set_active (pad, TRUE);
+
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_cb, &data,
NULL);
fail_unless (pad != NULL);
gst_pad_set_active (pad, TRUE);
+
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
id = gst_pad_add_probe (pad, type, block_async_cb_return_ok, NULL, NULL);
gst_pad_set_chain_function (sink, gst_check_chain_func);
gst_pad_set_active (src, TRUE);
gst_pad_set_active (sink, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
fail_unless (gst_pad_link (src, sink) == GST_PAD_LINK_OK);
gst_pad_add_probe (src,
gst_pad_push_event (src, gst_event_new_flush_start ());
gst_pad_push_event (src, gst_event_new_flush_stop (TRUE));
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
/* push a buffer so the events are propagated downstream */
gst_pad_push (src, gst_buffer_new ());
fail_unless (pad != NULL);
gst_pad_set_active (pad, TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_full_cb,
&state, block_async_full_destroy);
fail_unless (state == 0);
fail_unless (pad != NULL);
gst_pad_set_active (pad, TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
(void) gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_full_cb,
&state, block_async_full_destroy);
fail_unless (pad != NULL);
gst_pad_set_active (pad, TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (pad,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
GST_DEBUG ("adding probe");
id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK,
block_async_first_no_flush, bool_user_data, NULL);
return TRUE;
}
+static GstFlowReturn
+test_sticky_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+}
+
GST_START_TEST (test_sticky_events)
{
GstPad *srcpad, *sinkpad;
fail_unless (gst_pad_get_stream_id (srcpad) == NULL);
/* push an event, it should be sticky on the srcpad */
- gst_pad_push_event (srcpad, gst_event_new_stream_start ("test"));
+ fail_unless (gst_pad_push_event (srcpad,
+ gst_event_new_stream_start ("test")) == TRUE);
/* let's see if it stuck */
id = gst_pad_get_stream_id (srcpad);
fail_unless (sinkpad != NULL);
sticky_count = 0;
gst_pad_set_event_function (sinkpad, test_sticky_events_handler);
+ gst_pad_set_chain_function (sinkpad, test_sticky_chain);
fail_unless (sticky_count == 0);
gst_pad_set_active (sinkpad, TRUE);
gst_pad_push_event (srcpad, gst_event_new_caps (caps));
gst_caps_unref (caps);
- /* should have triggered 2 events */
- fail_unless (sticky_count == 3);
+ /* should have triggered 2 events, the segment event is still pending */
+ fail_unless_equals_int (sticky_count, 2);
+
+ fail_unless (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_OK);
+
+ /* should have triggered 3 events */
+ fail_unless_equals_int (sticky_count, 3);
gst_object_unref (srcpad);
gst_object_unref (sinkpad);
/* turn off timeout */
tcase_set_timeout (tc_chain, 60);
+ gst_segment_init (&dummy_segment, GST_FORMAT_BYTES);
+
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_link);
tcase_add_test (tc_chain, test_refcount);
GstPad *srcpad;
GstPad *sinkpad[2];
gint padcount;
+ gboolean first;
};
struct _GstAggregatorClass
{
if (!inbuf)
goto eos;
+ if (aggregator->first) {
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_push_event (aggregator->srcpad,
+ gst_event_new_stream_start ("test"));
+ gst_pad_push_event (aggregator->srcpad, gst_event_new_segment (&segment));
+ aggregator->first = FALSE;
+ }
+
/* just forward the first buffer */
GST_DEBUG_OBJECT (aggregator, "forward buffer %p", inbuf);
return gst_pad_push (aggregator->srcpad, inbuf);
agregator->collect = gst_collect_pads_new ();
gst_collect_pads_set_function (agregator->collect,
GST_DEBUG_FUNCPTR (gst_agregator_collected), agregator);
+
+ agregator->first = TRUE;
}
static gboolean
GstFlowReturn flow;
GstCaps *caps;
TestData *test_data = (TestData *) user_data;
+ GstSegment segment;
gst_pad_push_event (test_data->pad, gst_event_new_stream_start ("test"));
gst_pad_push_event (test_data->pad, gst_event_new_caps (caps));
gst_caps_unref (caps);
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ gst_pad_push_event (test_data->pad, gst_event_new_segment (&segment));
+
flow = gst_pad_push (test_data->pad, test_data->buffer);
fail_unless (flow == GST_FLOW_OK, "got flow %s instead of OK",
gst_flow_get_name (flow));