videomixer: Send caps event from the streaming thread
authorThibault Saunier <thibault.saunier@collabora.com>
Sat, 18 May 2013 18:36:39 +0000 (14:36 -0400)
committerThibault Saunier <thibault.saunier@collabora.com>
Sun, 19 May 2013 13:28:04 +0000 (09:28 -0400)
This way we avoid races in caps negotiation and we make sure
that the caps are sent after stream-start.

https://bugzilla.gnome.org/show_bug.cgi?id=684237

gst/videomixer/videomixer2.c
gst/videomixer/videomixer2.h

index 5464af6062b48286225b9d76af81ebab47e4159b..abe9fb8a0ddbde5d4828756450869040f811f4d4 100644 (file)
@@ -976,6 +976,14 @@ gst_videomixer2_collected (GstCollectPads * pads, GstVideoMixer2 * mix)
     mix->send_stream_start = FALSE;
   }
 
+  if (mix->send_caps) {
+    if (!gst_pad_push_event (mix->srcpad,
+            gst_event_new_caps (mix->current_caps))) {
+      GST_WARNING_OBJECT (mix->srcpad, "Sending caps event failed");
+    }
+    mix->send_caps = FALSE;
+  }
+
   GST_VIDEO_MIXER2_LOCK (mix);
 
   if (mix->newseg_pending) {
@@ -1604,20 +1612,13 @@ gst_videomixer2_src_setcaps (GstPad * pad, GstVideoMixer2 * mix, GstCaps * caps)
   }
   GST_VIDEO_MIXER2_UNLOCK (mix);
 
-  if (mix->send_stream_start) {
-    gchar s_id[32];
-
-    /* stream-start (FIXME: create id based on input ids) */
-    g_snprintf (s_id, sizeof (s_id), "mix-%08x", g_random_int ());
-    if (!gst_pad_push_event (mix->srcpad, gst_event_new_stream_start (s_id))) {
-      GST_WARNING_OBJECT (mix->srcpad, "Sending stream start event failed");
-    }
-    mix->send_stream_start = FALSE;
+  if (mix->current_caps == NULL ||
+      gst_caps_is_equal (caps, mix->current_caps) == FALSE) {
+    gst_caps_replace (&mix->current_caps, caps);
+    mix->send_caps = TRUE;
   }
 
-  ret = gst_pad_set_caps (pad, caps);
 done:
-
   return ret;
 }
 
@@ -1794,6 +1795,8 @@ gst_videomixer2_change_state (GstElement * element, GstStateChange transition)
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       mix->send_stream_start = TRUE;
+      mix->send_caps = TRUE;
+      gst_caps_replace (&mix->current_caps, NULL);
       GST_LOG_OBJECT (mix, "starting collectpads");
       gst_collect_pads_start (mix->collect);
       break;
@@ -1934,6 +1937,14 @@ gst_videomixer2_finalize (GObject * o)
   G_OBJECT_CLASS (parent_class)->finalize (o);
 }
 
+static void
+gst_videomixer2_dispose (GObject * o)
+{
+  GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (o);
+
+  gst_caps_replace (&mix->current_caps, NULL);
+}
+
 static void
 gst_videomixer2_get_property (GObject * object,
     guint prop_id, GValue * value, GParamSpec * pspec)
@@ -2012,6 +2023,7 @@ gst_videomixer2_class_init (GstVideoMixer2Class * klass)
   GstElementClass *gstelement_class = (GstElementClass *) klass;
 
   gobject_class->finalize = gst_videomixer2_finalize;
+  gobject_class->dispose = gst_videomixer2_dispose;
 
   gobject_class->get_property = gst_videomixer2_get_property;
   gobject_class->set_property = gst_videomixer2_set_property;
@@ -2058,6 +2070,7 @@ gst_videomixer2_init (GstVideoMixer2 * mix)
 
   mix->collect = gst_collect_pads_new ();
   mix->background = DEFAULT_BACKGROUND;
+  mix->current_caps = NULL;
 
   gst_collect_pads_set_function (mix->collect,
       (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_videomixer2_collected),
index a22b83aff283065c81f83aab17bd3a108bbcdda7..b8532561455edee4c1be371b4e1e8af953697d68 100644 (file)
@@ -92,6 +92,10 @@ struct _GstVideoMixer2
   /* Output caps */
   GstVideoInfo info;
 
+  /* current caps */
+  GstCaps *current_caps;
+  gboolean send_caps;
+
   gboolean newseg_pending;
   gboolean flush_stop_pending;