summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
m---------common0
-rw-r--r--gst/udp/gstmultiudpsink.c4
-rw-r--r--gst/udp/gstudpnetutils.c17
-rw-r--r--gst/udp/gstudpnetutils.h2
-rw-r--r--gst/udp/gstudpsrc.c14
6 files changed, 32 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 676b6e84..4bf7eb2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-11-20 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/udp/gstmultiudpsink.c:
+ * gst/udp/gstudpnetutils.c:
+ * gst/udp/gstudpnetutils.h:
+ * gst/udp/gstudpsrc.c:
+ Fix multiudpsink on OSX by passing the specific length of the socket,
+ refactor that into a function shared with the same thing in udpsrc.
+
2008-11-20 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int),
diff --git a/common b/common
-Subproject edfb4b44ea433b0b83b8a2f27a6e0bcbccdc3f2
+Subproject e4b2fe44724e1c1a6e816ae4fbbae43d7f68f1e
diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c
index d43f1ff9..95d15ab3 100644
--- a/gst/udp/gstmultiudpsink.c
+++ b/gst/udp/gstmultiudpsink.c
@@ -374,6 +374,7 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
gint ret, size, num = 0;
guint8 *data;
GList *clients;
+ gint len;
sink = GST_MULTIUDPSINK (bsink);
@@ -395,12 +396,13 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client);
while (TRUE) {
+ len = gst_udp_get_sockaddr_length (&client->theiraddr);
#ifdef G_OS_WIN32
ret = sendto (*client->sock, (char *) data, size, 0,
#else
ret = sendto (*client->sock, data, size, 0,
#endif
- (struct sockaddr *) &client->theiraddr, sizeof (client->theiraddr));
+ (struct sockaddr *) &client->theiraddr, len);
if (ret < 0) {
/* we get a non-posix EPERM on Linux when a firewall rule blocks this
* destination. We will simply ignore this. */
diff --git a/gst/udp/gstudpnetutils.c b/gst/udp/gstudpnetutils.c
index b3fa8870..07c80448 100644
--- a/gst/udp/gstudpnetutils.c
+++ b/gst/udp/gstudpnetutils.c
@@ -60,6 +60,23 @@ gst_udp_net_utils_win32_wsa_startup (GstObject * obj)
#endif
int
+gst_udp_get_sockaddr_length (struct sockaddr_storage *addr)
+{
+ /* MacOS is picky about passing precisely the correct length,
+ * so we calculate it here for the given socket type.
+ */
+ switch (addr->ss_family) {
+ case AF_INET:
+ return sizeof (struct sockaddr_in);
+ case AF_INET6:
+ return sizeof (struct sockaddr_in6);
+ default:
+ /* don't know, Screw MacOS and use the full length */
+ return sizeof (*addr);
+ }
+}
+
+int
gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr)
{
struct addrinfo hints, *res, *nres;
diff --git a/gst/udp/gstudpnetutils.h b/gst/udp/gstudpnetutils.h
index 6c3f740f..3e5b297a 100644
--- a/gst/udp/gstudpnetutils.h
+++ b/gst/udp/gstudpnetutils.h
@@ -74,6 +74,8 @@ gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj);
#endif
+int gst_udp_get_sockaddr_length(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);
diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c
index 1139995f..b16a0521 100644
--- a/gst/udp/gstudpsrc.c
+++ b/gst/udp/gstudpsrc.c
@@ -777,19 +777,7 @@ gst_udpsrc_start (GstBaseSrc * bsrc)
GST_DEBUG_OBJECT (src, "binding on port %d", src->port);
- /* Mac OS is picky about the size for the bind so we switch on the family */
- switch (src->myaddr.ss_family) {
- case AF_INET:
- len = sizeof (struct sockaddr_in);
- break;
- case AF_INET6:
- len = sizeof (struct sockaddr_in6);
- break;
- default:
- /* don't know, Screw MacOS and use the full length */
- len = sizeof (src->myaddr);
- break;
- }
+ len = gst_udp_get_sockaddr_length (&src->myaddr);
if ((ret = bind (src->sock.fd, (struct sockaddr *) &src->myaddr, len)) < 0)
goto bind_error;