interleave: Send stream-start before caps event
authorNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Sun, 12 May 2013 03:08:23 +0000 (23:08 -0400)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 13 May 2013 13:37:38 +0000 (15:37 +0200)
gst/interleave/interleave.c

index 82104224f884c5aea150e68df94909d090274ebc..474e6e8a1d3de6c9afcdc620cce11c4856f2b6d2 100644 (file)
@@ -296,6 +296,24 @@ gst_interleave_set_channel_positions (GstInterleave * self, GstStructure * s)
   gst_structure_set (s, "channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
 }
 
+static void
+gst_interleave_send_stream_start (GstInterleave * self)
+{
+  GST_OBJECT_LOCK (self);
+  if (self->send_stream_start) {
+    gchar s_id[32];
+
+    self->send_stream_start = FALSE;
+    GST_OBJECT_UNLOCK (self);
+
+    /* stream-start (FIXME: create id based on input ids) */
+    g_snprintf (s_id, sizeof (s_id), "interleave-%08x", g_random_int ());
+    gst_pad_push_event (self->src, gst_event_new_stream_start (s_id));
+  } else {
+    GST_OBJECT_UNLOCK (self);
+  }
+}
+
 static void
 gst_interleave_class_init (GstInterleaveClass * klass)
 {
@@ -386,7 +404,6 @@ gst_interleave_init (GstInterleave * self)
   gst_pad_set_event_function (self->src,
       GST_DEBUG_FUNCPTR (gst_interleave_src_event));
 
-  gst_pad_set_active (self->src, TRUE);
   gst_element_add_pad (GST_ELEMENT (self), self->src);
 
   self->collect = gst_collect_pads_new ();
@@ -508,8 +525,7 @@ gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ,
     gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL);
     gst_interleave_set_channel_positions (self, s);
 
-    /* FIXME: send caps event after stream-start event */
-    gst_pad_set_active (self->src, TRUE);
+    gst_interleave_send_stream_start (self);
     gst_pad_set_caps (self->src, srccaps);
     gst_caps_unref (srccaps);
 
@@ -575,7 +591,7 @@ gst_interleave_release_pad (GstElement * element, GstPad * pad)
       gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL);
       gst_interleave_set_channel_positions (self, s);
 
-      gst_pad_set_active (self->src, TRUE);
+      gst_interleave_send_stream_start (self);
       gst_pad_set_caps (self->src, srccaps);
       gst_caps_unref (srccaps);
     } else {
@@ -762,7 +778,7 @@ gst_interleave_sink_setcaps (GstInterleave * self, GstPad * pad,
     gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL);
     gst_interleave_set_channel_positions (self, s);
 
-    gst_pad_set_active (self->src, TRUE);
+    gst_interleave_send_stream_start (self);
     res = gst_pad_set_caps (self->src, srccaps);
     gst_caps_unref (srccaps);
 
@@ -1189,18 +1205,6 @@ gst_interleave_collected (GstCollectPads * pads, GstInterleave * self)
   GstMapInfo write_info;
   GstClockTime timestamp = -1;
 
-  /* FIXME: send caps and tags after stream-start */
-#if 0
-  if (self->send_stream_start) {
-    gchar s_id[32];
-
-    /* stream-start (FIXME: create id based on input ids) */
-    g_snprintf (s_id, sizeof (s_id), "interleave-%08x", g_random_int ());
-    gst_pad_push_event (self->src, gst_event_new_stream_start (s_id));
-    self->send_stream_start = FALSE;
-  }
-#endif
-
   size = gst_collect_pads_available (pads);
   if (size == 0)
     goto eos;