summaryrefslogtreecommitdiffstats
path: root/gst/udp/gstmultiudpsink.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/udp/gstmultiudpsink.c')
-rw-r--r--gst/udp/gstmultiudpsink.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c
index 72fec4cf..21899c95 100644
--- a/gst/udp/gstmultiudpsink.c
+++ b/gst/udp/gstmultiudpsink.c
@@ -400,6 +400,14 @@ join_multicast (GstUDPClient * client)
perror ("setsockopt IP_MULTICAST_LOOP\n");
}
+static void
+leave_multicast (GstUDPClient * client)
+{
+ if (setsockopt (*(client->sock), IPPROTO_IP, IP_DROP_MEMBERSHIP,
+ &(client->multi_addr), sizeof (client->multi_addr)) < 0)
+ perror ("setsockopt IP_DROP_MEMBERSHIP\n");
+}
+
/* create a socket for sending to remote machine */
static gboolean
gst_multiudpsink_init_send (GstMultiUDPSink * sink)
@@ -563,6 +571,9 @@ gst_multiudpsink_remove (GstMultiUDPSink * sink, const gchar * host, gint port)
g_get_current_time (&now);
client->disconnect_time = GST_TIMEVAL_TO_TIME (now);
+ if (client->multi_addr.imr_multiaddr.s_addr)
+ leave_multicast (client);
+
/* Unlock to emit signal before we delete the actual client */
g_mutex_unlock (sink->client_lock);
g_signal_emit (G_OBJECT (sink),