summaryrefslogtreecommitdiff
path: root/gst/adder
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2012-09-23 13:31:17 +0100
committerTim-Philipp Müller <tim@centricular.net>2012-09-23 13:31:17 +0100
commitcec6d634b607cd490971551906dbceeb3b1f36cb (patch)
treebfb251fab88d132c4058292c9e1c5de95b45e531 /gst/adder
parent1c22b1fe11601bae217bca2e134f8372e7f9b824 (diff)
downloadgstreamer-plugins-base-cec6d634b607cd490971551906dbceeb3b1f36cb.tar.gz
adder: send stream-start event, and send caps event after stream-start
Delay sending of caps event so that it is sent only after the stream-start event.
Diffstat (limited to 'gst/adder')
-rw-r--r--gst/adder/gstadder.c22
-rw-r--r--gst/adder/gstadder.h3
2 files changed, 24 insertions, 1 deletions
diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c
index 0efdc81d3..84488968b 100644
--- a/gst/adder/gstadder.c
+++ b/gst/adder/gstadder.c
@@ -296,7 +296,7 @@ gst_adder_setcaps (GstAdder * adder, GstPad * pad, GstCaps * caps)
GST_INFO_OBJECT (pad, "setting caps to %" GST_PTR_FORMAT, caps);
adder->current_caps = gst_caps_ref (caps);
- gst_pad_push_event (adder->srcpad, gst_event_new_caps (adder->current_caps));
+ /* send caps event later, after stream-start event */
it = gst_element_iterate_pads (GST_ELEMENT_CAST (adder));
@@ -1114,6 +1114,24 @@ gst_adder_collected (GstCollectPads * pads, gpointer user_data)
if (G_UNLIKELY (adder->func == NULL))
goto not_negotiated;
+ if (adder->send_stream_start) {
+ gchar s_id[32];
+
+ /* stream-start (FIXME: create id based on input ids) */
+ g_snprintf (s_id, sizeof (s_id), "adder-%08x", g_random_int ());
+ gst_pad_push_event (adder->srcpad, gst_event_new_stream_start (s_id));
+ adder->send_stream_start = FALSE;
+ }
+
+ if (adder->send_caps) {
+ GstEvent *caps_event;
+
+ caps_event = gst_event_new_caps (adder->current_caps);
+ GST_INFO_OBJECT (adder, "caps event %" GST_PTR_FORMAT, caps_event);
+ gst_pad_push_event (adder->srcpad, caps_event);
+ adder->send_caps = FALSE;
+ }
+
if (g_atomic_int_compare_and_exchange (&adder->flush_stop_pending,
TRUE, FALSE)) {
GST_DEBUG_OBJECT (adder, "pending flush stop");
@@ -1339,6 +1357,8 @@ gst_adder_change_state (GstElement * element, GstStateChange transition)
adder->flush_stop_pending = FALSE;
adder->new_segment_pending = TRUE;
adder->wait_for_new_segment = FALSE;
+ adder->send_stream_start = TRUE;
+ adder->send_caps = TRUE;
gst_caps_replace (&adder->current_caps, NULL);
gst_segment_init (&adder->segment, GST_FORMAT_TIME);
gst_collect_pads_start (adder->collect);
diff --git a/gst/adder/gstadder.h b/gst/adder/gstadder.h
index 59d6f9bec..9c61e12e6 100644
--- a/gst/adder/gstadder.h
+++ b/gst/adder/gstadder.h
@@ -81,6 +81,9 @@ struct _GstAdder {
GList *pending_events;
gboolean in_setcaps;
+
+ gboolean send_stream_start;
+ gboolean send_caps;
};
struct _GstAdderClass {