updsrc: Add to join multiple multicast interfaces

https://bugzilla.gnome.org/show_bug.cgi?id=776030
This commit is contained in:
Wonchul Lee 2016-12-13 11:11:07 +09:00 committed by Sebastian Dröge
parent 8ad0baccc2
commit c7e23476c4

View file

@ -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);
}
} }
} }