diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2013-09-03 11:23:24 +0200 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-09-03 11:23:24 +0200 |
commit | 7f594369791547095eaff13cbbfcb596defbef9c (patch) | |
tree | 5a0516840cbece5cd845b4b1754df75f7b7279a4 /gst | |
parent | 73751dbbe7d37d7847e22e81e3faf793af48bbb8 (diff) |
udpsrc: Bind to multicast addresses on non-Windows systems
On Windows it's not possible to bind to a multicast address
but the OS will make sure to filter out all packets that
arrive not for the multicast address the socket joined.
On Linux and others it is necessary to bind to a multicast
address to let the OS filter out all packets that are received
on the same port but for different addresses than the multicast
address
And deprecate the multicast-group property and replace it with the
address property.
https://bugzilla.gnome.org/show_bug.cgi?id=707042
Diffstat (limited to 'gst')
-rw-r--r-- | gst/udp/gstudpsrc.c | 69 | ||||
-rw-r--r-- | gst/udp/gstudpsrc.h | 2 |
2 files changed, 39 insertions, 32 deletions
diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c index 02e91ee4c..8cb4b0921 100644 --- a/gst/udp/gstudpsrc.c +++ b/gst/udp/gstudpsrc.c @@ -173,7 +173,7 @@ enum PROP_USED_SOCKET, PROP_AUTO_MULTICAST, PROP_REUSE, - PROP_BIND_ADDRESS, + PROP_ADDRESS, PROP_LAST }; @@ -226,9 +226,11 @@ gst_udpsrc_class_init (GstUDPSrcClass * klass) g_param_spec_int ("port", "Port", "The port to receive the packets from, 0=allocate", 0, G_MAXUINT16, UDP_DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /* FIXME 2.0: Remove multicast-group property */ g_object_class_install_property (gobject_class, PROP_MULTICAST_GROUP, g_param_spec_string ("multicast-group", "Multicast Group", - "The Address of multicast group to join", UDP_DEFAULT_MULTICAST_GROUP, + "The Address of multicast group to join. DEPRECATED: " + "Use address property instead", UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE, g_param_spec_string ("multicast-iface", "Multicast Interface", @@ -278,16 +280,10 @@ gst_udpsrc_class_init (GstUDPSrcClass * klass) g_object_class_install_property (gobject_class, PROP_REUSE, g_param_spec_boolean ("reuse", "Reuse", "Enable reuse of the port", UDP_DEFAULT_REUSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /* FIXME 2.0: multicast-group and bind-address should - * be separated, the former only being the multicast group and - * the latter always being the address the socket is bound too, - * even if a multicast group is given. - */ - g_object_class_install_property (gobject_class, PROP_BIND_ADDRESS, - g_param_spec_string ("bind-address", "Bind Address", - "Address to bind the socket to. This is equivalent to the " - "multicast-group property", UDP_DEFAULT_MULTICAST_GROUP, + g_object_class_install_property (gobject_class, PROP_ADDRESS, + g_param_spec_string ("address", "Address", + "Address to receive packets for. This is equivalent to the " + "multicast-group property for now", UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gst_element_class_add_pad_template (gstelement_class, @@ -315,7 +311,7 @@ gst_udpsrc_init (GstUDPSrc * udpsrc) g_strdup_printf ("udp://%s:%u", UDP_DEFAULT_MULTICAST_GROUP, UDP_DEFAULT_PORT); - udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); + udpsrc->address = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); udpsrc->port = UDP_DEFAULT_PORT; udpsrc->socket = UDP_DEFAULT_SOCKET; udpsrc->multi_iface = g_strdup (UDP_DEFAULT_MULTICAST_IFACE); @@ -356,8 +352,8 @@ gst_udpsrc_finalize (GObject * object) g_free (udpsrc->uri); udpsrc->uri = NULL; - g_free (udpsrc->multi_group); - udpsrc->multi_group = NULL; + g_free (udpsrc->address); + udpsrc->address = NULL; if (udpsrc->socket) g_object_unref (udpsrc->socket); @@ -587,17 +583,17 @@ skip_error: static gboolean gst_udpsrc_set_uri (GstUDPSrc * src, const gchar * uri, GError ** error) { - gchar *multi_group; + gchar *address; guint16 port; - if (!gst_udp_parse_uri (uri, &multi_group, &port)) + if (!gst_udp_parse_uri (uri, &address, &port)) goto wrong_uri; if (port == (guint16) - 1) port = UDP_DEFAULT_PORT; - g_free (src->multi_group); - src->multi_group = multi_group; + g_free (src->address); + src->address = address; src->port = port; g_free (src->uri); @@ -630,22 +626,22 @@ gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, udpsrc->port = g_value_get_int (value); g_free (udpsrc->uri); udpsrc->uri = - g_strdup_printf ("udp://%s:%u", udpsrc->multi_group, udpsrc->port); + g_strdup_printf ("udp://%s:%u", udpsrc->address, udpsrc->port); break; case PROP_MULTICAST_GROUP: - case PROP_BIND_ADDRESS: + case PROP_ADDRESS: { const gchar *group; - g_free (udpsrc->multi_group); + g_free (udpsrc->address); if ((group = g_value_get_string (value))) - udpsrc->multi_group = g_strdup (group); + udpsrc->address = g_strdup (group); else - udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); + udpsrc->address = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); g_free (udpsrc->uri); udpsrc->uri = - g_strdup_printf ("udp://%s:%u", udpsrc->multi_group, udpsrc->port); + g_strdup_printf ("udp://%s:%u", udpsrc->address, udpsrc->port); break; } case PROP_MULTICAST_IFACE: @@ -730,8 +726,8 @@ gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value, g_value_set_int (value, udpsrc->port); break; case PROP_MULTICAST_GROUP: - case PROP_BIND_ADDRESS: - g_value_set_string (value, udpsrc->multi_group); + case PROP_ADDRESS: + g_value_set_string (value, udpsrc->address); break; case PROP_MULTICAST_IFACE: g_value_set_string (value, udpsrc->multi_iface); @@ -824,10 +820,10 @@ gst_udpsrc_start (GstBaseSrc * bsrc) if (src->socket == NULL) { /* need to allocate a socket */ - GST_DEBUG_OBJECT (src, "allocating socket for %s:%d", src->multi_group, + GST_DEBUG_OBJECT (src, "allocating socket for %s:%d", src->address, src->port); - addr = gst_udpsrc_resolve (src, src->multi_group); + addr = gst_udpsrc_resolve (src, src->address); if (!addr) goto name_resolve; @@ -847,9 +843,20 @@ gst_udpsrc_start (GstBaseSrc * bsrc) GST_DEBUG_OBJECT (src, "binding on port %d", src->port); + /* On Windows it's not possible to bind to a multicast address + * but the OS will make sure to filter out all packets that + * arrive not for the multicast address the socket joined. + * + * On Linux and others it is necessary to bind to a multicast + * address to let the OS filter out all packets that are received + * on the same port but for different addresses than the multicast + * address + */ +#if G_OS_WIN32 if (g_inet_address_get_is_multicast (addr)) bind_addr = g_inet_address_new_any (g_inet_address_get_family (addr)); else +#endif bind_addr = G_INET_ADDRESS (g_object_ref (addr)); g_object_unref (addr); @@ -955,7 +962,7 @@ gst_udpsrc_start (GstBaseSrc * bsrc) && g_inet_address_get_is_multicast (g_inet_socket_address_get_address (src->addr))) { - GST_DEBUG_OBJECT (src, "joining multicast group %s", src->multi_group); + GST_DEBUG_OBJECT (src, "joining multicast group %s", src->address); if (!g_socket_join_multicast_group (src->used_socket, g_inet_socket_address_get_address (src->addr), FALSE, src->multi_iface, &err)) @@ -1068,7 +1075,7 @@ gst_udpsrc_stop (GstBaseSrc * bsrc) (src->addr))) { GError *err = NULL; - GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->multi_group); + GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->address); if (!g_socket_leave_multicast_group (src->used_socket, g_inet_socket_address_get_address (src->addr), FALSE, diff --git a/gst/udp/gstudpsrc.h b/gst/udp/gstudpsrc.h index b7c3f14af..c631e35ea 100644 --- a/gst/udp/gstudpsrc.h +++ b/gst/udp/gstudpsrc.h @@ -48,7 +48,7 @@ struct _GstUDPSrc { GstPushSrc parent; /* properties */ - gchar *multi_group; + gchar *address; gint port; gchar *multi_iface; gint ttl; |