videoaggregator: Do source pad negotiation only from the aggregated function
authorSebastian Dröge <sebastian@centricular.com>
Thu, 27 Nov 2014 18:52:20 +0000 (19:52 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 27 Nov 2014 18:54:10 +0000 (19:54 +0100)
Otherwise we might negotiate from the sinkpad streaming threads at
the same time as on the srcpad streaming thread, and then all kinds
of crazy bugs happen that don't make any sense at all.

gst-libs/gst/video/gstvideoaggregator.c

index c640e67..8af97ce 100644 (file)
@@ -770,11 +770,8 @@ gst_videoaggregator_pad_sink_setcaps (GstPad * pad, GstObject * parent,
   }
 
   vaggpad->info = info;
-
-  ret = gst_videoaggregator_update_converters (vagg);
-
-  if (ret)
-    ret = gst_videoaggregator_update_src_caps (vagg);
+  gst_pad_mark_reconfigure (vagg->aggregator.srcpad);
+  ret = TRUE;
 
   GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
 
@@ -1206,16 +1203,19 @@ gst_videoaggregator_aggregate (GstAggregator * agg)
   gint res;
   gint64 jitter;
 
-  /* If we're not negotiated_caps yet... */
-  if (GST_VIDEO_INFO_FORMAT (&vagg->info) == GST_VIDEO_FORMAT_UNKNOWN) {
-    GST_INFO_OBJECT (agg, "Not negotiated yet!");
-    return GST_FLOW_NOT_NEGOTIATED;
-  }
-
   GST_VIDEO_AGGREGATOR_LOCK (vagg);
 
-  if (gst_pad_check_reconfigure (agg->srcpad))
-    gst_videoaggregator_update_src_caps (vagg);
+  if (GST_VIDEO_INFO_FORMAT (&vagg->info) == GST_VIDEO_FORMAT_UNKNOWN
+      || gst_pad_check_reconfigure (agg->srcpad)) {
+    ret = gst_videoaggregator_update_converters (vagg);
+    if (ret)
+      ret = gst_videoaggregator_update_src_caps (vagg);
+
+    if (!ret) {
+      GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
+      return GST_FLOW_NOT_NEGOTIATED;
+    }
+  }
 
   if (agg->segment.position == -1)
     output_start_time = agg->segment.start;
@@ -1648,7 +1648,7 @@ gst_videoaggregator_release_pad (GstElement * element, GstPad * pad)
 {
   GstVideoAggregator *vagg = NULL;
   GstVideoAggregatorPad *vaggpad;
-  gboolean update_caps, last_pad;
+  gboolean last_pad;
 
   vagg = GST_VIDEO_AGGREGATOR (element);
   vaggpad = GST_VIDEO_AGGREGATOR_PAD (pad);
@@ -1659,13 +1659,10 @@ gst_videoaggregator_release_pad (GstElement * element, GstPad * pad)
   last_pad = (GST_ELEMENT (vagg)->numsinkpads - 1 == 0);
   GST_OBJECT_UNLOCK (vagg);
 
-  if (!last_pad)
-    gst_videoaggregator_update_converters (vagg);
-  else
+  if (last_pad)
     gst_videoaggregator_reset (vagg);
 
   gst_buffer_replace (&vaggpad->buffer, NULL);
-  update_caps = GST_VIDEO_INFO_FORMAT (&vagg->info) != GST_VIDEO_FORMAT_UNKNOWN;
 
   gst_child_proxy_child_removed (GST_CHILD_PROXY (vagg), G_OBJECT (vaggpad),
       GST_OBJECT_NAME (vaggpad));
@@ -1673,8 +1670,7 @@ gst_videoaggregator_release_pad (GstElement * element, GstPad * pad)
   GST_ELEMENT_CLASS (gst_videoaggregator_parent_class)->release_pad (GST_ELEMENT
       (vagg), pad);
 
-  if (update_caps)
-    gst_videoaggregator_update_src_caps (vagg);
+  gst_pad_mark_reconfigure (vagg->aggregator.srcpad);
 
   GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
   return;