rtsp-stream: avoid pushing data on unlinked udpsrc pad during setup
authorGöran Jönsson <goranjn@axis.com>
Wed, 27 Jun 2018 06:30:42 +0000 (08:30 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Wed, 27 Jun 2018 10:25:45 +0000 (12:25 +0200)
Fix race when setting up source elements.

Since we set the source element(s) to PLAYING state before hooking
them up to the downstream funnel, it's possible for the source element
to receive packets before we actually get to linking it to the funnel,
in which case buffers would be pushed out on an unlinked pad, causing
it to error out and stop receiving more data.

We fix this by blocking the source's srcpad until we have linked it.

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

gst/rtsp-server/rtsp-stream.c

index 092109c..9537357 100644 (file)
@@ -3002,10 +3002,15 @@ plug_src (GstRTSPStream * stream, GstBin * bin, GstElement * src,
 {
   GstRTSPStreamPrivate *priv;
   GstPad *pad, *selpad;
+  gulong id = 0;
 
   priv = stream->priv;
 
+  pad = gst_element_get_static_pad (src, "src");
   if (priv->srcpad) {
+    /* block pad so src can't push data while it's not yet linked */
+    id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK |
+        GST_PAD_PROBE_TYPE_BUFFER, NULL, NULL, NULL);
     /* we set and keep these to playing so that they don't cause NO_PREROLL return
      * values. This is only relevant for PLAY pipelines */
     gst_element_set_state (src, GST_STATE_PLAYING);
@@ -3017,8 +3022,9 @@ plug_src (GstRTSPStream * stream, GstBin * bin, GstElement * src,
 
   /* and link to the funnel */
   selpad = gst_element_get_request_pad (funnel, "sink_%u");
-  pad = gst_element_get_static_pad (src, "src");
   gst_pad_link (pad, selpad);
+  if (id != 0)
+    gst_pad_remove_probe (pad, id);
   gst_object_unref (pad);
   gst_object_unref (selpad);
 }