mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-30 15:52:32 +00:00
updsrc: Add to join multiple multicast interfaces
https://bugzilla.gnome.org/show_bug.cgi?id=776030
This commit is contained in:
parent
8ad0baccc2
commit
c7e23476c4
1 changed files with 52 additions and 13 deletions
|
@ -522,7 +522,8 @@ gst_udpsrc_class_init (GstUDPSrcClass * klass)
|
||||||
#endif
|
#endif
|
||||||
g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE,
|
g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE,
|
||||||
g_param_spec_string ("multicast-iface", "Multicast Interface",
|
g_param_spec_string ("multicast-iface", "Multicast Interface",
|
||||||
"The network interface on which to join the multicast group",
|
"The network interface on which to join the multicast group."
|
||||||
|
"This allows multiple interfaces seperated by comma. (\"eth0,eth1\")",
|
||||||
UDP_DEFAULT_MULTICAST_IFACE,
|
UDP_DEFAULT_MULTICAST_IFACE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
g_object_class_install_property (gobject_class, PROP_URI,
|
g_object_class_install_property (gobject_class, PROP_URI,
|
||||||
|
@ -1430,11 +1431,30 @@ gst_udpsrc_open (GstUDPSrc * src)
|
||||||
&&
|
&&
|
||||||
g_inet_address_get_is_multicast (g_inet_socket_address_get_address
|
g_inet_address_get_is_multicast (g_inet_socket_address_get_address
|
||||||
(src->addr))) {
|
(src->addr))) {
|
||||||
GST_DEBUG_OBJECT (src, "joining multicast group %s", src->address);
|
|
||||||
if (!g_socket_join_multicast_group (src->used_socket,
|
if (src->multi_iface) {
|
||||||
g_inet_socket_address_get_address (src->addr),
|
GStrv multi_ifaces = g_strsplit (src->multi_iface, ",", -1);
|
||||||
FALSE, src->multi_iface, &err))
|
gchar **ifaces = multi_ifaces;
|
||||||
goto membership;
|
while (*ifaces) {
|
||||||
|
g_strstrip (*ifaces);
|
||||||
|
GST_DEBUG_OBJECT (src, "joining multicast group %s interface %s",
|
||||||
|
src->address, *ifaces);
|
||||||
|
if (!g_socket_join_multicast_group (src->used_socket,
|
||||||
|
g_inet_socket_address_get_address (src->addr),
|
||||||
|
FALSE, *ifaces, &err)) {
|
||||||
|
g_strfreev (multi_ifaces);
|
||||||
|
goto membership;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifaces++;
|
||||||
|
}
|
||||||
|
g_strfreev (multi_ifaces);
|
||||||
|
} else {
|
||||||
|
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, NULL, &err))
|
||||||
|
goto membership;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_inet_address_get_family (g_inet_socket_address_get_address
|
if (g_inet_address_get_family (g_inet_socket_address_get_address
|
||||||
(src->addr)) == G_SOCKET_FAMILY_IPV4) {
|
(src->addr)) == G_SOCKET_FAMILY_IPV4) {
|
||||||
|
@ -1589,14 +1609,33 @@ gst_udpsrc_close (GstUDPSrc * src)
|
||||||
(src->addr))) {
|
(src->addr))) {
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->address);
|
if (src->multi_iface) {
|
||||||
|
GStrv multi_ifaces = g_strsplit (src->multi_iface, ",", -1);
|
||||||
|
gchar **ifaces = multi_ifaces;
|
||||||
|
while (*ifaces) {
|
||||||
|
g_strstrip (*ifaces);
|
||||||
|
GST_DEBUG_OBJECT (src, "leaving multicast group %s interface %s",
|
||||||
|
src->address, *ifaces);
|
||||||
|
if (!g_socket_leave_multicast_group (src->used_socket,
|
||||||
|
g_inet_socket_address_get_address (src->addr),
|
||||||
|
FALSE, *ifaces, &err)) {
|
||||||
|
GST_ERROR_OBJECT (src, "Failed to leave multicast group: %s",
|
||||||
|
err->message);
|
||||||
|
g_clear_error (&err);
|
||||||
|
}
|
||||||
|
ifaces++;
|
||||||
|
}
|
||||||
|
g_strfreev (multi_ifaces);
|
||||||
|
|
||||||
if (!g_socket_leave_multicast_group (src->used_socket,
|
} else {
|
||||||
g_inet_socket_address_get_address (src->addr), FALSE,
|
GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->address);
|
||||||
src->multi_iface, &err)) {
|
if (!g_socket_leave_multicast_group (src->used_socket,
|
||||||
GST_ERROR_OBJECT (src, "Failed to leave multicast group: %s",
|
g_inet_socket_address_get_address (src->addr), FALSE,
|
||||||
err->message);
|
NULL, &err)) {
|
||||||
g_clear_error (&err);
|
GST_ERROR_OBJECT (src, "Failed to leave multicast group: %s",
|
||||||
|
err->message);
|
||||||
|
g_clear_error (&err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue