summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
Diffstat (limited to 'gst')
-rw-r--r--gst/udp/gstudpsrc.c69
-rw-r--r--gst/udp/gstudpsrc.h2
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;