[farsight2/master] Remove the request pad before the sinks.

Olivier Crête olivier.crete at collabora.co.uk
Tue Dec 23 15:26:56 PST 2008


This is required to prevent the race where a buffer is stuck in the sink while trying to stop it and returns wrong-state
---
 transmitters/multicast/fs-multicast-transmitter.c |   14 +++++++-------
 transmitters/nice/fs-nice-transmitter.c           |   21 +++++++++++++++------
 transmitters/rawudp/fs-rawudp-transmitter.c       |   14 +++++++-------
 3 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/transmitters/multicast/fs-multicast-transmitter.c b/transmitters/multicast/fs-multicast-transmitter.c
index 7b70d76..0802c35 100644
--- a/transmitters/multicast/fs-multicast-transmitter.c
+++ b/transmitters/multicast/fs-multicast-transmitter.c
@@ -880,6 +880,13 @@ fs_multicast_transmitter_put_udpsock (FsMulticastTransmitter *trans,
     gst_object_unref (udpsock->udpsrc_requested_pad);
   }
 
+  if (udpsock->udpsink_requested_pad)
+  {
+    gst_element_release_request_pad (udpsock->tee,
+      udpsock->udpsink_requested_pad);
+    gst_object_unref (udpsock->udpsink_requested_pad);
+  }
+
   if (udpsock->udpsink)
   {
     GstStateChangeReturn ret;
@@ -892,13 +899,6 @@ fs_multicast_transmitter_put_udpsock (FsMulticastTransmitter *trans,
       GST_ERROR ("Could not remove udpsink element from transmitter source");
   }
 
-  if (udpsock->udpsink_requested_pad)
-  {
-    gst_element_release_request_pad (udpsock->tee,
-      udpsock->udpsink_requested_pad);
-    gst_object_unref (udpsock->udpsink_requested_pad);
-  }
-
   if (udpsock->fd >= 0)
     close (udpsock->fd);
 
diff --git a/transmitters/nice/fs-nice-transmitter.c b/transmitters/nice/fs-nice-transmitter.c
index 86a9bd5..73be87a 100644
--- a/transmitters/nice/fs-nice-transmitter.c
+++ b/transmitters/nice/fs-nice-transmitter.c
@@ -717,12 +717,6 @@ fs_nice_transmitter_free_gst_stream (FsNiceTransmitter *self,
       gst_object_unref (ns->nicesinks[c]);
     }
 
-    if (ns->requested_tee_pads[c])
-    {
-      gst_element_release_request_pad (self->priv->sink_tees[c],
-          ns->requested_tee_pads[c]);
-      gst_object_unref (ns->requested_tee_pads[c]);
-    }
   }
 
   g_free (ns->nicesrcs);
@@ -753,6 +747,15 @@ fs_nice_transmitter_set_sending (FsNiceTransmitter *self,
     for (c = 1; c <= self->components; c++)
     {
       GstStateChangeReturn ret;
+
+
+      if (ns->requested_tee_pads[c])
+      {
+        gst_element_release_request_pad (self->priv->sink_tees[c],
+            ns->requested_tee_pads[c]);
+        gst_object_unref (ns->requested_tee_pads[c]);
+      }
+
       gst_element_set_locked_state (ns->nicesinks[c], TRUE);
       ret = gst_element_set_state (ns->nicesinks[c], GST_STATE_NULL);
       if (ret != GST_STATE_CHANGE_SUCCESS)
@@ -778,6 +781,12 @@ fs_nice_transmitter_set_sending (FsNiceTransmitter *self,
       if (!gst_element_sync_state_with_parent (ns->nicesinks[c]))
         GST_ERROR ("Could sync the state of the nicesink with its parent");
 
+
+      ns->requested_tee_pads[c] =
+        gst_element_get_request_pad (self->priv->sink_tees[c], "src%d");
+
+      g_warn_if_fail (ns->requested_tee_pads[c]);
+
       elempad = gst_element_get_static_pad (ns->nicesinks[c], "sink");
       ret = gst_pad_link (ns->requested_tee_pads[c], elempad);
       if (GST_PAD_LINK_FAILED(ret))
diff --git a/transmitters/rawudp/fs-rawudp-transmitter.c b/transmitters/rawudp/fs-rawudp-transmitter.c
index fc50164..900437e 100644
--- a/transmitters/rawudp/fs-rawudp-transmitter.c
+++ b/transmitters/rawudp/fs-rawudp-transmitter.c
@@ -816,6 +816,13 @@ fs_rawudp_transmitter_put_udpport (FsRawUdpTransmitter *trans,
     gst_object_unref (udpport->udpsrc_requested_pad);
   }
 
+  if (udpport->udpsink_requested_pad)
+  {
+    gst_element_release_request_pad (udpport->tee,
+        udpport->udpsink_requested_pad);
+    gst_object_unref (udpport->udpsink_requested_pad);
+  }
+
   if (udpport->udpsink)
   {
     GstStateChangeReturn ret;
@@ -828,13 +835,6 @@ fs_rawudp_transmitter_put_udpport (FsRawUdpTransmitter *trans,
       GST_ERROR ("Could not remove udpsink element from transmitter source");
   }
 
-  if (udpport->udpsink_requested_pad)
-  {
-    gst_element_release_request_pad (udpport->tee,
-        udpport->udpsink_requested_pad);
-    gst_object_unref (udpport->udpsink_requested_pad);
-  }
-
   if (udpport->fd >= 0)
     close (udpport->fd);
 
-- 
1.5.6.5




More information about the farsight-commits mailing list