[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