mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-01 05:39:51 +00:00
tests: Fix event order warnings and dataflow before stream-start/segment event
This commit is contained in:
parent
f38496067d
commit
114f9584d4
13 changed files with 220 additions and 41 deletions
|
@ -98,6 +98,8 @@ GST_START_TEST (test_clipping)
|
|||
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;
|
||||
|
@ -262,6 +264,8 @@ GST_START_TEST (test_preroll_sync)
|
|||
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;
|
||||
|
@ -475,6 +479,8 @@ GST_START_TEST (test_eos)
|
|||
fail_unless (eret == TRUE);
|
||||
}
|
||||
|
||||
gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
|
||||
|
||||
/* send segment, this should now work again */
|
||||
{
|
||||
GstEvent *event;
|
||||
|
@ -540,6 +546,8 @@ GST_START_TEST (test_eos2)
|
|||
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;
|
||||
|
@ -645,6 +653,8 @@ GST_START_TEST (test_position)
|
|||
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;
|
||||
|
|
|
@ -143,6 +143,9 @@ GST_START_TEST (test_seeking)
|
|||
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)));
|
||||
|
||||
|
|
|
@ -36,6 +36,10 @@ struct TestData
|
|||
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);
|
||||
|
@ -57,15 +61,19 @@ setup_test_objects (struct TestData *td, GstPadChainFunction chain_func)
|
|||
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)));
|
||||
|
@ -164,6 +172,7 @@ eos_event_func (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
GST_START_TEST (test_funnel_eos)
|
||||
{
|
||||
struct TestData td;
|
||||
GstSegment segment;
|
||||
|
||||
setup_test_objects (&td, chain_ok);
|
||||
|
||||
|
@ -196,6 +205,10 @@ GST_START_TEST (test_funnel_eos)
|
|||
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);
|
||||
|
||||
|
@ -236,11 +249,6 @@ funnel_suite (void)
|
|||
{
|
||||
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);
|
||||
|
|
|
@ -46,12 +46,10 @@ event_func (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
{
|
||||
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 *
|
||||
|
@ -87,12 +85,17 @@ GST_START_TEST (test_one_buffer)
|
|||
{
|
||||
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);
|
||||
|
||||
|
|
|
@ -420,6 +420,9 @@ run_output_order_test (gint n_linked)
|
|||
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);
|
||||
|
@ -456,6 +459,9 @@ run_output_order_test (gint n_linked)
|
|||
|
||||
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);
|
||||
|
@ -596,6 +602,8 @@ GST_START_TEST (test_sparse_stream)
|
|||
"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;
|
||||
|
@ -612,6 +620,9 @@ GST_START_TEST (test_sparse_stream)
|
|||
|
||||
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);
|
||||
|
@ -644,12 +655,6 @@ GST_START_TEST (test_sparse_stream)
|
|||
|
||||
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;
|
||||
|
|
|
@ -223,6 +223,7 @@ GST_START_TEST (test_non_leaky_overrun)
|
|||
GstBuffer *buffer2;
|
||||
GstBuffer *buffer3;
|
||||
GstBuffer *buffer;
|
||||
GstSegment segment;
|
||||
|
||||
g_signal_connect (queue, "overrun",
|
||||
G_CALLBACK (queue_overrun_link_and_activate), NULL);
|
||||
|
@ -239,7 +240,9 @@ GST_START_TEST (test_non_leaky_overrun)
|
|||
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);
|
||||
|
@ -316,6 +319,7 @@ GST_START_TEST (test_leaky_upstream)
|
|||
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);
|
||||
|
@ -331,7 +335,9 @@ GST_START_TEST (test_leaky_upstream)
|
|||
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);
|
||||
|
@ -402,6 +408,7 @@ GST_START_TEST (test_leaky_downstream)
|
|||
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);
|
||||
|
@ -417,7 +424,9 @@ GST_START_TEST (test_leaky_downstream)
|
|||
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);
|
||||
|
@ -483,6 +492,7 @@ GST_START_TEST (test_time_level)
|
|||
{
|
||||
GstBuffer *buffer = NULL;
|
||||
GstClockTime time;
|
||||
GstSegment segment;
|
||||
|
||||
g_signal_connect (queue, "overrun",
|
||||
G_CALLBACK (queue_overrun_link_and_activate), NULL);
|
||||
|
@ -500,7 +510,9 @@ GST_START_TEST (test_time_level)
|
|||
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);
|
||||
|
|
|
@ -225,6 +225,7 @@ GST_START_TEST (test_filled_read)
|
|||
GstBuffer *buffer;
|
||||
GstPad *sinkpad, *srcpad;
|
||||
GThread *thread;
|
||||
GstSegment segment;
|
||||
|
||||
queue2 = gst_element_factory_make ("queue2", NULL);
|
||||
sinkpad = gst_element_get_static_pad (queue2, "sink");
|
||||
|
@ -238,6 +239,10 @@ GST_START_TEST (test_filled_read)
|
|||
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);
|
||||
|
|
|
@ -56,8 +56,8 @@ probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
|
|||
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 */
|
||||
|
@ -217,6 +217,7 @@ push_newsegment_events (GList * input_pads)
|
|||
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));
|
||||
}
|
||||
}
|
||||
|
@ -227,12 +228,10 @@ push_switched_buffers (GList * input_pads,
|
|||
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) {
|
||||
|
@ -250,7 +249,6 @@ push_switched_buffers (GList * input_pads,
|
|||
|
||||
/* cleanup buffer */
|
||||
gst_buffer_unref (buf);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
/* Create output-selector with given number of src pads and switch
|
||||
|
|
|
@ -460,6 +460,7 @@ GST_START_TEST (test_flow_aggregation)
|
|||
GstPad *teesink, *teesrc1, *teesrc2;
|
||||
GstElement *tee;
|
||||
GstBuffer *buffer;
|
||||
GstSegment segment;
|
||||
GstCaps *caps;
|
||||
|
||||
caps = gst_caps_new_empty_simple ("test/test");
|
||||
|
@ -477,19 +478,20 @@ GST_START_TEST (test_flow_aggregation)
|
|||
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);
|
||||
|
@ -516,7 +518,6 @@ GST_START_TEST (test_flow_aggregation)
|
|||
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);
|
||||
|
||||
|
@ -528,9 +529,7 @@ GST_START_TEST (test_flow_aggregation)
|
|||
/* 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 */
|
||||
|
|
|
@ -919,6 +919,7 @@ GST_START_TEST (test_fake_eos)
|
|||
GstPad *sinkpad;
|
||||
GstFlowReturn res;
|
||||
GThread *thread;
|
||||
GstSegment segment;
|
||||
|
||||
pipeline = gst_pipeline_new ("pipeline");
|
||||
|
||||
|
@ -932,6 +933,10 @@ GST_START_TEST (test_fake_eos)
|
|||
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);
|
||||
|
@ -1073,6 +1078,8 @@ GST_START_TEST (test_async_done)
|
|||
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);
|
||||
|
|
|
@ -1130,6 +1130,7 @@ GST_START_TEST (test_ghost_pads_remove_while_playing)
|
|||
{
|
||||
GstPad *sinkpad;
|
||||
GstPad *srcpad;
|
||||
GstSegment segment;
|
||||
|
||||
bin = gst_bin_new (NULL);
|
||||
gst_element_set_state (bin, GST_STATE_PLAYING);
|
||||
|
@ -1147,6 +1148,12 @@ GST_START_TEST (test_ghost_pads_remove_while_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);
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include <gst/check/gstcheck.h>
|
||||
|
||||
static GstSegment dummy_segment;
|
||||
|
||||
GST_START_TEST (test_link)
|
||||
{
|
||||
GstPad *src, *sink;
|
||||
|
@ -226,7 +228,12 @@ sticky_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
{
|
||||
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);
|
||||
|
@ -268,14 +275,21 @@ GST_START_TEST (test_sticky_caps_unlinked)
|
|||
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);
|
||||
|
@ -332,17 +346,24 @@ GST_START_TEST (test_sticky_caps_unlinked_incompatible)
|
|||
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);
|
||||
|
@ -401,12 +422,18 @@ GST_START_TEST (test_sticky_caps_flushing)
|
|||
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);
|
||||
|
@ -499,9 +526,13 @@ GST_START_TEST (test_push_unlinked)
|
|||
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");
|
||||
|
@ -569,15 +600,22 @@ GST_START_TEST (test_push_linked)
|
|||
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 ();
|
||||
|
||||
|
@ -660,16 +698,19 @@ GST_START_TEST (test_push_linked_flushing)
|
|||
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);
|
||||
|
@ -686,13 +727,18 @@ GST_START_TEST (test_push_linked_flushing)
|
|||
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);
|
||||
|
@ -711,7 +757,7 @@ GST_START_TEST (test_push_linked_flushing)
|
|||
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);
|
||||
|
@ -770,9 +816,16 @@ GST_START_TEST (test_push_buffer_list_compat)
|
|||
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));
|
||||
|
@ -1005,6 +1058,12 @@ GST_START_TEST (test_block_async)
|
|||
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);
|
||||
|
||||
|
@ -1041,6 +1100,12 @@ test_pad_blocking_with_type (GstPadProbeType type)
|
|||
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);
|
||||
|
||||
|
||||
|
@ -1170,6 +1235,12 @@ GST_START_TEST (test_pad_probe_flush_events)
|
|||
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,
|
||||
|
@ -1182,6 +1253,9 @@ GST_START_TEST (test_pad_probe_flush_events)
|
|||
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 ());
|
||||
|
||||
|
@ -1356,6 +1430,11 @@ GST_START_TEST (test_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);
|
||||
|
||||
id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK, block_async_full_cb,
|
||||
&state, block_async_full_destroy);
|
||||
fail_unless (state == 0);
|
||||
|
@ -1385,6 +1464,11 @@ GST_START_TEST (test_block_async_full_destroy_dispose)
|
|||
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);
|
||||
|
||||
|
@ -1495,6 +1579,11 @@ GST_START_TEST (test_block_async_replace_callback_no_flush)
|
|||
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);
|
||||
|
@ -1550,6 +1639,13 @@ test_sticky_events_handler (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
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;
|
||||
|
@ -1566,7 +1662,8 @@ GST_START_TEST (test_sticky_events)
|
|||
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);
|
||||
|
@ -1587,6 +1684,7 @@ GST_START_TEST (test_sticky_events)
|
|||
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);
|
||||
|
||||
|
@ -1601,8 +1699,13 @@ GST_START_TEST (test_sticky_events)
|
|||
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);
|
||||
|
@ -1619,6 +1722,8 @@ gst_pad_suite (void)
|
|||
/* 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);
|
||||
|
|
|
@ -45,6 +45,7 @@ struct _GstAggregator
|
|||
GstPad *srcpad;
|
||||
GstPad *sinkpad[2];
|
||||
gint padcount;
|
||||
gboolean first;
|
||||
};
|
||||
struct _GstAggregatorClass
|
||||
{
|
||||
|
@ -79,6 +80,16 @@ gst_agregator_collected (GstCollectPads * pads, gpointer user_data)
|
|||
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);
|
||||
|
@ -226,6 +237,8 @@ gst_aggregator_init (GstAggregator * agregator)
|
|||
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
|
||||
|
@ -326,6 +339,7 @@ push_buffer (gpointer user_data)
|
|||
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"));
|
||||
|
||||
|
@ -333,6 +347,9 @@ push_buffer (gpointer user_data)
|
|||
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));
|
||||
|
|
Loading…
Reference in a new issue