mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-05 02:02:26 +00:00
gst/udp/: Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separ...
Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): * gst/udp/gstudpnetutils.c: (gst_udp_set_loop_ttl), (gst_udp_join_group): * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separated.
This commit is contained in:
parent
961eed538b
commit
e206f74bce
6 changed files with 66 additions and 34 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2008-05-21 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send),
|
||||||
|
(gst_multiudpsink_add_internal):
|
||||||
|
* gst/udp/gstudpnetutils.c: (gst_udp_set_loop_ttl),
|
||||||
|
(gst_udp_join_group):
|
||||||
|
* gst/udp/gstudpnetutils.h:
|
||||||
|
* gst/udp/gstudpsrc.c: (gst_udpsrc_start):
|
||||||
|
Joining a multicast group and setting the loop/ttl properties are
|
||||||
|
totally unrelated tasks are must be separated.
|
||||||
|
|
||||||
2008-05-21 Stefan Kost <ensonic@users.sf.net>
|
2008-05-21 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
* gst/avi/gstavimux.c:
|
* gst/avi/gstavimux.c:
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit d0749502b0e891038593866f619a75305367b409
|
Subproject commit 5e771924d59d9ac912237ea466d0c60ad95df5ab
|
|
@ -621,14 +621,14 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
|
||||||
sink->bytes_to_serve = 0;
|
sink->bytes_to_serve = 0;
|
||||||
sink->bytes_served = 0;
|
sink->bytes_served = 0;
|
||||||
|
|
||||||
|
gst_udp_set_loop_ttl (sink->sock, sink->loop, sink->ttl);
|
||||||
gst_multiudpsink_setup_qos_dscp (sink);
|
gst_multiudpsink_setup_qos_dscp (sink);
|
||||||
|
|
||||||
/* look for multicast clients and join multicast groups approptiately */
|
/* look for multicast clients and join multicast groups approptiately */
|
||||||
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
|
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
|
||||||
client = (GstUDPClient *) clients->data;
|
client = (GstUDPClient *) clients->data;
|
||||||
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
|
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
|
||||||
gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
|
gst_udp_join_group (*(client->sock), &client->theiraddr);
|
||||||
&client->theiraddr);
|
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -680,8 +680,7 @@ gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host,
|
||||||
GST_DEBUG_OBJECT (sink, "multicast address detected");
|
GST_DEBUG_OBJECT (sink, "multicast address detected");
|
||||||
if (sink->auto_multicast) {
|
if (sink->auto_multicast) {
|
||||||
GST_DEBUG_OBJECT (sink, "joining multicast group");
|
GST_DEBUG_OBJECT (sink, "joining multicast group");
|
||||||
gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
|
gst_udp_join_group (*(client->sock), &client->theiraddr);
|
||||||
&client->theiraddr);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (sink, "normal address detected");
|
GST_DEBUG_OBJECT (sink, "normal address detected");
|
||||||
|
|
|
@ -91,12 +91,53 @@ gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gst_udp_join_group (int sockfd, gboolean loop, int ttl,
|
gst_udp_set_loop_ttl (int sockfd, gboolean loop, int ttl)
|
||||||
struct sockaddr_storage *addr)
|
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
int l = (loop == FALSE) ? 0 : 1;
|
int l = (loop == FALSE) ? 0 : 1;
|
||||||
|
|
||||||
|
switch (addr->ss_family) {
|
||||||
|
case AF_INET:
|
||||||
|
{
|
||||||
|
if ((ret =
|
||||||
|
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
|
||||||
|
sizeof (l))) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((ret =
|
||||||
|
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
|
||||||
|
sizeof (ttl))) < 0)
|
||||||
|
return ret;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AF_INET6:
|
||||||
|
{
|
||||||
|
if ((ret =
|
||||||
|
setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l,
|
||||||
|
sizeof (l))) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((ret =
|
||||||
|
setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl,
|
||||||
|
sizeof (ttl))) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
errno = EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
gst_udp_join_group (int sockfd, struct sockaddr_storage *addr)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
switch (addr->ss_family) {
|
switch (addr->ss_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
|
@ -106,23 +147,13 @@ gst_udp_join_group (int sockfd, gboolean loop, int ttl,
|
||||||
((struct sockaddr_in *) addr)->sin_addr.s_addr;
|
((struct sockaddr_in *) addr)->sin_addr.s_addr;
|
||||||
mreq4.imr_interface.s_addr = INADDR_ANY;
|
mreq4.imr_interface.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
if ((ret =
|
|
||||||
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
|
|
||||||
sizeof (l))) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((ret =
|
|
||||||
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
|
|
||||||
sizeof (ttl))) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((ret =
|
if ((ret =
|
||||||
setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
(const void *) &mreq4, sizeof (mreq4))) < 0)
|
(const void *) &mreq4, sizeof (mreq4))) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
struct ipv6_mreq mreq6;
|
struct ipv6_mreq mreq6;
|
||||||
|
@ -132,27 +163,16 @@ gst_udp_join_group (int sockfd, gboolean loop, int ttl,
|
||||||
sizeof (struct in6_addr));
|
sizeof (struct in6_addr));
|
||||||
mreq6.ipv6mr_interface = 0;
|
mreq6.ipv6mr_interface = 0;
|
||||||
|
|
||||||
if ((ret =
|
|
||||||
setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l,
|
|
||||||
sizeof (l))) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((ret =
|
|
||||||
setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl,
|
|
||||||
sizeof (ttl))) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((ret =
|
if ((ret =
|
||||||
setsockopt (sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
|
setsockopt (sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
|
||||||
(const void *) &mreq6, sizeof (mreq6))) < 0)
|
(const void *) &mreq6, sizeof (mreq6))) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
errno = EAFNOSUPPORT;
|
errno = EAFNOSUPPORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,9 @@ gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj);
|
||||||
int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr);
|
int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr);
|
||||||
int gst_udp_is_multicast (struct sockaddr_storage *addr);
|
int gst_udp_is_multicast (struct sockaddr_storage *addr);
|
||||||
|
|
||||||
int gst_udp_join_group (int sockfd, gboolean loop, int ttl, struct sockaddr_storage *addr);
|
int gst_udp_set_loop_ttl (int sockfd, gboolean loop, int ttl);
|
||||||
|
|
||||||
|
int gst_udp_join_group (int sockfd, struct sockaddr_storage *addr);
|
||||||
int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr);
|
int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr);
|
||||||
|
|
||||||
#endif /* __GST_UDP_NET_UTILS_H__*/
|
#endif /* __GST_UDP_NET_UTILS_H__*/
|
||||||
|
|
|
@ -738,7 +738,7 @@ gst_udpsrc_start (GstBaseSrc * bsrc)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_udp_is_multicast (&src->myaddr)) {
|
if (gst_udp_is_multicast (&src->myaddr)) {
|
||||||
ret = gst_udp_join_group (src->sock.fd, TRUE, src->ttl, &src->myaddr);
|
ret = gst_udp_join_group (src->sock.fd, &src->myaddr);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto membership;
|
goto membership;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue