From: <wt...@ke...> - 2006-07-10 10:22:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Jul 10 2006 10:22:09 UTC Log message: Patch by: Rob Taylor <robtaylor at floopily dot org> * gst/udp/gstmultiudpsink.c: (join_multicast), (gst_multiudpsink_init_send), (gst_multiudpsink_add): If a destination is added before the stream is set to PAUSED, the multicast group is not joined as the socket is not created yet. Also TTL and LOOP should also be set. Fixes #346921. Modified files: . : ChangeLog gst/udp : gstmultiudpsink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2425&r2=1.2426 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2425 retrieving revision 1.2426 diff -u -d -r1.2425 -r1.2426 --- ChangeLog 8 Jul 2006 22:41:25 -0000 1.2425 +++ ChangeLog 10 Jul 2006 10:21:57 -0000 1.2426 @@ -1,3 +1,13 @@ +2006-07-10 Wim Taymans <wi...@fl...> + + Patch by: Rob Taylor <robtaylor at floopily dot org> + * gst/udp/gstmultiudpsink.c: (join_multicast), + (gst_multiudpsink_init_send), (gst_multiudpsink_add): + If a destination is added before the stream is set to PAUSED, the + multicast group is not joined as the socket is not created yet. + Also TTL and LOOP should also be set. Fixes #346921. 2006-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org> * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), Index: gstmultiudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstmultiudpsink.c 22 Jun 2006 19:31:04 -0000 1.14 +++ gstmultiudpsink.c 10 Jul 2006 10:21:57 -0000 1.15 @@ -370,6 +370,26 @@ } } +static void +join_multicast (GstUDPClient * client) +{ + unsigned char ttl = 64; + unsigned char loop = 1; + /* Joining the multicast group */ + /* FIXME, can we use multicast and unicast over the same + * socket? if not, search for socket of this multicast group or + * create a new one. */ + if (setsockopt (*(client->sock), IPPROTO_IP, IP_ADD_MEMBERSHIP, + &(client->multi_addr), sizeof (client->multi_addr)) < 0) + perror ("setsockopt IP_ADD_MEMBERSHIP\n"); + if (setsockopt (*(client->sock), IPPROTO_IP, IP_MULTICAST_TTL, &ttl, + sizeof (ttl)) < 0) + perror ("setsockopt IP_MULTICAST_TTL\n"); + if (setsockopt (*(client->sock), IPPROTO_IP, IP_MULTICAST_LOOP, &loop, + sizeof (loop)) < 0) + perror ("setsockopt IP_MULTICAST_LOOP\n"); +} /* create a socket for sending to remote machine */ static gboolean @@ -377,6 +397,8 @@ { guint bc_val; gint ret; + GList *clients; + GstUDPClient *client; /* create sender socket */ if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) @@ -391,8 +413,14 @@ sink->bytes_to_serve = 0; sink->bytes_served = 0; - return TRUE; + /* look for multicast clients and join multicast groups approptiately */ + for (clients = sink->clients; clients; clients = g_list_next (clients)) { + client = (GstUDPClient *) clients->data; + if (client->multi_addr.imr_multiaddr.s_addr) + join_multicast (client); + } + return TRUE; /* ERRORS */ no_socket: { @@ -420,7 +448,6 @@ struct hostent *he; struct in_addr addr; - struct ip_mreq multi_addr; GstUDPClient *client; GTimeVal now; @@ -431,6 +458,7 @@ client->sock = &sink->sock; memset (&client->theiraddr, 0, sizeof (client->theiraddr)); + memset (&client->multi_addr, 0, sizeof (client->multi_addr)); client->theiraddr.sin_family = AF_INET; /* host byte order */ client->theiraddr.sin_port = htons (port); /* short, network byte order */ @@ -441,20 +469,18 @@ if (inet_aton (host, &addr)) { /* check if its a multicast address */ if ((ntohl (addr.s_addr) & 0xe0000000) == 0xe0000000) { + printf ("multicast address detected\n"); client->multi_addr.imr_multiaddr.s_addr = addr.s_addr; client->multi_addr.imr_interface.s_addr = INADDR_ANY; - client->theiraddr.sin_addr = multi_addr.imr_multiaddr; + client->theiraddr.sin_addr = client->multi_addr.imr_multiaddr; - /* Joining the multicast group */ - /* FIXME, can we use multicast and unicast over the same - * socket? if not, search for socket of this multicast group or - * create a new one. */ - setsockopt (sink->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &multi_addr, - sizeof (multi_addr)); } else { client->theiraddr.sin_addr = *((struct in_addr *) &addr); } + /* if init_send has already been called, set sockopts for multicast */ + if (*client->sock > 0) /* we dont need to lookup for localhost */ else if (strcmp (host, "localhost") == 0 && inet_aton ("127.0.0.1", &addr)) { |
From: <wt...@ke...> - 2006-07-27 11:29:36
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jul 27 2006 09:05:03 UTC Log message: Patch by: Thijs Vermeir <thijs dot vermeir at barco dot com> * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: Added "buffer" property to control the kernel receive buffer size. Update documentation. Small cleanups. Fixes #348752. API: buffer property Modified files: . : ChangeLog gst/udp : gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2459&r2=1.2460 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.17&r2=1.18 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2459 retrieving revision 1.2460 diff -u -d -r1.2459 -r1.2460 --- ChangeLog 26 Jul 2006 16:36:59 -0000 1.2459 +++ ChangeLog 27 Jul 2006 09:04:50 -0000 1.2460 @@ -1,3 +1,16 @@ +2006-07-27 Wim Taymans <wi...@fl...> + + Patch by: Thijs Vermeir <thijs dot vermeir at barco dot com> + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_start): + * gst/udp/gstudpsrc.h: + Added "buffer" property to control the kernel receive buffer size. + Update documentation. + Small cleanups. Fixes #348752. + API: buffer property 2006-07-26 Wim Taymans <wi...@fl...> Patch by: Kai Vehmanen <kv2004 at eca dot cx> Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- gstudpsrc.c 24 Jul 2006 11:48:03 -0000 1.54 +++ gstudpsrc.c 27 Jul 2006 09:04:51 -0000 1.55 @@ -46,6 +46,8 @@ * <programlisting> * gst-launch -v udpsrc port=0 ! fakesink * </programlisting> + * After setting the udpsrc to PAUSED, the allocated port can be obtained by + * reading the port property. * </para> * <para> * udpsrc can read from multicast groups by setting the multicast_group property @@ -62,6 +64,13 @@ * using SDP or other means. + * The "buffer" property is used to change the default kernel buffer sizes used for + * receiving packets. The buffer size may be increased for high-volume connections, + * or may be decreased to limit the possible backlog of incoming data. + * The system places an absolute limit on these values, on Linux, for example, the + * default buffer size is typically 50K and can be increased to maximally 100K. + * </para> + * <para> * The udpsrc is always a live source. It does however not provide a GstClock, this * is left for upstream elements such as an RTP session manager or demuxer (such * as an MPEG demuxer). @@ -70,9 +79,11 @@ * udpsrc implements a GstURIHandler interface that handles udp://host:port type * URIs. + * + * Last reviewed on 2006-07-27 (0.10.4) * </refsect2> */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -117,10 +128,12 @@ GST_ELEMENT_DETAILS ("UDP packet receiver", "Source/Network", "Receive data over the network via UDP", - "Wim Taymans <wi...@fl...>"); + "Wim Taymans <wi...@fl...>\n" + "Thijs Vermeir <thi...@ba...>"); #define UDP_DEFAULT_PORT 4951 #define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" +#define UDP_DEFAULT_BUFFER 0 #define UDP_DEFAULT_URI "udp://"UDP_DEFAULT_MULTICAST_GROUP":"G_STRINGIFY(UDP_DEFAULT_PORT) #define UDP_DEFAULT_CAPS NULL #define UDP_DEFAULT_SOCKFD -1 @@ -132,7 +145,8 @@ PROP_MULTICAST_GROUP, PROP_URI, PROP_CAPS, - PROP_SOCKFD + PROP_SOCKFD, + PROP_BUFFER /* FILL ME */ }; @@ -192,11 +206,11 @@ gobject_class->get_property = gst_udpsrc_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, - g_param_spec_int ("port", "port", + 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_object_class_install_property (gobject_class, PROP_MULTICAST_GROUP, - g_param_spec_string ("multicast_group", "multicast_group", + g_param_spec_string ("multicast_group", "Multicast Group", "The Address of multicast group to join", UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_URI, @@ -207,9 +221,13 @@ g_param_spec_boxed ("caps", "Caps", "The caps of the source pad", GST_TYPE_CAPS, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_SOCKFD, - g_param_spec_int ("sockfd", "socket handle", + g_param_spec_int ("sockfd", "Socket Handle", "Socket to use for UDP reception. (-1 == allocate)", -1, G_MAXINT, UDP_DEFAULT_SOCKFD, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER, + g_param_spec_int ("buffer", "Buffer", + "Number of bytes of the UDP Buffer, 0=default", 0, G_MAXINT, + UDP_DEFAULT_BUFFER, G_PARAM_READWRITE)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; @@ -229,6 +247,7 @@ udpsrc->sock = UDP_DEFAULT_SOCKFD; udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); udpsrc->uri = g_strdup (UDP_DEFAULT_URI); + udpsrc->buffer = UDP_DEFAULT_BUFFER; } static GstCaps * @@ -354,6 +373,7 @@ break; } + /* special case buffer so receivers can also track the address */ outbuf = gst_netbuffer_new (); GST_BUFFER_DATA (outbuf) = (guint8 *) pktdata; GST_BUFFER_MALLOCDATA (outbuf) = (guint8 *) pktdata; @@ -362,14 +382,15 @@ gst_netaddress_set_ip4_address (&outbuf->from, tmpaddr.sin_addr.s_addr, tmpaddr.sin_port); - gst_buffer_set_caps (GST_BUFFER (outbuf), udpsrc->caps); + gst_buffer_set_caps (GST_BUFFER_CAST (outbuf), udpsrc->caps); GST_LOG_OBJECT (udpsrc, "read %d bytes", readsize); - *buf = GST_BUFFER (outbuf); + *buf = GST_BUFFER_CAST (outbuf); return GST_FLOW_OK; + /* ERRORS */ select_error: { GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), @@ -452,6 +473,9 @@ GstUDPSrc *udpsrc = GST_UDPSRC (object); switch (prop_id) { + case PROP_BUFFER: + udpsrc->buffer = g_value_get_int (value); + break; case PROP_PORT: udpsrc->port = g_value_get_int (value); gst_udpsrc_update_uri (udpsrc); @@ -503,6 +527,9 @@ + g_value_set_int (value, udpsrc->buffer); g_value_set_int (value, udpsrc->port); @@ -535,6 +562,7 @@ int port; GstUDPSrc *src; gint ret; + int rcvsize; src = GST_UDPSRC (bsrc); @@ -592,20 +620,42 @@ if ((ret = getsockname (src->sock, (struct sockaddr *) &my_addr, &len)) < 0) goto getsockname_error; - port = ntohs (my_addr.sin_port); - GST_DEBUG_OBJECT (src, "bound, on port %d", port); - if (port != src->port) { - src->port = port; - GST_DEBUG_OBJECT (src, "notifying %d", port); - g_object_notify (G_OBJECT (src), "port"); + len = sizeof (rcvsize); + if (src->buffer != 0) { + rcvsize = src->buffer; + GST_DEBUG_OBJECT (src, "setting udp buffer of %d bytes", rcvsize); + /* set buffer size, Note that on Linux this is typically limited to a + * maximum of around 100K. Also a minimum of 128 bytes is required on + * Linux. */ + ret = setsockopt (src->sock, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, len); + if (ret != 0) + goto udpbuffer_error; + /* read the value of the receive buffer. Note that on linux this returns 2x the + * value we set because the kernel allocates extra memory for metadata. + * The default on Linux is about 100K (which is about 50K without metadata) */ + ret = getsockopt (src->sock, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, &len); + if (ret == 0) + GST_DEBUG_OBJECT (src, "have udp buffer of %d bytes", rcvsize); + else + GST_DEBUG_OBJECT (src, "could not get udp buffer size"); bc_val = 1; if ((ret = setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val))) < 0) goto no_broadcast; + port = ntohs (my_addr.sin_port); + GST_DEBUG_OBJECT (src, "bound, on port %d", port); + if (port != src->port) { + src->port = port; + GST_DEBUG_OBJECT (src, "notifying %d", port); + g_object_notify (G_OBJECT (src), "port"); + } src->myaddr.sin_port = htons (src->port + 1); return TRUE; @@ -655,6 +705,15 @@ ("getsockname failed %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; +udpbuffer_error: + { + close (src->sock); + src->sock = -1; + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Could not create a buffer of the size requested, %d: %s (%d)", ret, + g_strerror (errno), errno)); + return FALSE; no_broadcast: CLOSE_SOCKET (src->sock); Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstudpsrc.h 24 Jul 2006 11:48:03 -0000 1.17 +++ gstudpsrc.h 27 Jul 2006 09:04:51 -0000 1.18 @@ -51,11 +51,12 @@ struct _GstUDPSrc { GstPushSrc parent; + /* properties */ gchar *uri; gchar *multi_group; gint ttl; + gint buffer; int sock; int control_sock[2]; |
From: <wt...@ke...> - 2006-07-28 21:23:24
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jul 27 2006 10:05:39 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: Rename "buffer" to "buffer-size" to make clear it is a size we set and not some sort of feature we enable. Modified files: . : ChangeLog gst/udp : gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2461&r2=1.2462 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.56&r2=1.57 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2461 retrieving revision 1.2462 diff -u -d -r1.2461 -r1.2462 --- ChangeLog 27 Jul 2006 10:01:48 -0000 1.2461 +++ ChangeLog 27 Jul 2006 10:05:27 -0000 1.2462 @@ -1,3 +1,12 @@ +2006-07-27 Wim Taymans <wi...@fl...> + + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_set_property), (gst_udpsrc_get_property), + (gst_udpsrc_start): + * gst/udp/gstudpsrc.h: + Rename "buffer" to "buffer-size" to make clear it is a size we set and + not some sort of feature we enable. 2006-07-27 Tim-Philipp Müller <tim at centricular dot net> * gst/udp/gstudpsrc.c: (gst_udpsrc_start): @@ -12,10 +21,10 @@ (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: - Added "buffer" property to control the kernel receive buffer size. + Added "buffer-size" property to control the kernel receive buffer size. Update documentation. Small cleanups. Fixes #348752. - API: buffer property + API: buffer-size property 2006-07-26 Wim Taymans <wi...@fl...> Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- gstudpsrc.c 27 Jul 2006 10:01:49 -0000 1.56 +++ gstudpsrc.c 27 Jul 2006 10:05:27 -0000 1.57 @@ -133,7 +133,7 @@ #define UDP_DEFAULT_PORT 4951 #define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" -#define UDP_DEFAULT_BUFFER 0 +#define UDP_DEFAULT_BUFFER_SIZE 0 #define UDP_DEFAULT_URI "udp://"UDP_DEFAULT_MULTICAST_GROUP":"G_STRINGIFY(UDP_DEFAULT_PORT) #define UDP_DEFAULT_CAPS NULL #define UDP_DEFAULT_SOCKFD -1 @@ -146,8 +146,7 @@ PROP_URI, PROP_CAPS, PROP_SOCKFD, - PROP_BUFFER - /* FILL ME */ + PROP_BUFFER_SIZE }; static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); @@ -224,10 +223,10 @@ g_param_spec_int ("sockfd", "Socket Handle", "Socket to use for UDP reception. (-1 == allocate)", -1, G_MAXINT, UDP_DEFAULT_SOCKFD, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER, - g_param_spec_int ("buffer", "Buffer", - "Number of bytes of the UDP Buffer, 0=default", 0, G_MAXINT, - UDP_DEFAULT_BUFFER, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_SIZE, + g_param_spec_int ("buffer-size", "Buffer Size", + "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, + UDP_DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; @@ -247,7 +246,7 @@ udpsrc->sock = UDP_DEFAULT_SOCKFD; udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); udpsrc->uri = g_strdup (UDP_DEFAULT_URI); - udpsrc->buffer = UDP_DEFAULT_BUFFER; + udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; } static GstCaps * @@ -473,8 +472,8 @@ GstUDPSrc *udpsrc = GST_UDPSRC (object); switch (prop_id) { - case PROP_BUFFER: - udpsrc->buffer = g_value_get_int (value); + case PROP_BUFFER_SIZE: + udpsrc->buffer_size = g_value_get_int (value); break; case PROP_PORT: udpsrc->port = g_value_get_int (value); @@ -527,8 +526,8 @@ - g_value_set_int (value, udpsrc->buffer); + g_value_set_int (value, udpsrc->buffer_size); g_value_set_int (value, udpsrc->port); @@ -621,8 +620,8 @@ goto getsockname_error; len = sizeof (rcvsize); - if (src->buffer != 0) { - rcvsize = src->buffer; + if (src->buffer_size != 0) { + rcvsize = src->buffer_size; GST_DEBUG_OBJECT (src, "setting udp buffer of %d bytes", rcvsize); /* set buffer size, Note that on Linux this is typically limited to a Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstudpsrc.h 27 Jul 2006 09:04:51 -0000 1.18 +++ gstudpsrc.h 27 Jul 2006 10:05:27 -0000 1.19 @@ -56,7 +56,7 @@ int port; gchar *multi_group; gint ttl; - gint buffer; + gint buffer_size; int sock; int control_sock[2]; |
From: <wt...@ke...> - 2006-07-31 15:58:58
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Jul 31 2006 15:58:55 UTC Log message: * gst/udp/gstudpsrc.c: Fix docs. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2468&r2=1.2469 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.57&r2=1.58 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2468 retrieving revision 1.2469 diff -u -d -r1.2468 -r1.2469 --- ChangeLog 29 Jul 2006 16:32:26 -0000 1.2468 +++ ChangeLog 31 Jul 2006 15:58:43 -0000 1.2469 @@ -1,3 +1,8 @@ +2006-07-31 Wim Taymans <wi...@fl...> + + * gst/udp/gstudpsrc.c: + Fix docs. 2006-07-29 Stefan Kost <en...@us...> * ext/ladspa/gstsignalprocessor.c: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- gstudpsrc.c 27 Jul 2006 10:05:27 -0000 1.57 +++ gstudpsrc.c 31 Jul 2006 15:58:43 -0000 1.58 @@ -79,9 +79,9 @@ * udpsrc implements a GstURIHandler interface that handles udp://host:port type * URIs. * </para> - * + * <para> * Last reviewed on 2006-07-27 (0.10.4) + * </para> * </refsect2> */ #ifdef HAVE_CONFIG_H |
From: <wt...@ke...> - 2006-08-16 09:29:33
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Aug 16 2006 09:29:32 UTC Log message: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): Turn a g_print into a DEBUG line. Modified files: . : ChangeLog gst/udp : gstmultiudpsink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2483&r2=1.2484 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2483 retrieving revision 1.2484 diff -u -d -r1.2483 -r1.2484 --- ChangeLog 16 Aug 2006 09:25:17 -0000 1.2483 +++ ChangeLog 16 Aug 2006 09:29:19 -0000 1.2484 @@ -1,3 +1,8 @@ +2006-08-16 Wim Taymans <wi...@fl...> + + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): + Turn a g_print into a DEBUG line. 2006-08-13 Wim Taymans <wi...@fl...> * sys/oss/gstossmixer.c: (gst_ossmixer_open), (gst_ossmixer_new): Index: gstmultiudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstmultiudpsink.c 24 Jul 2006 11:48:03 -0000 1.16 +++ gstmultiudpsink.c 16 Aug 2006 09:29:20 -0000 1.17 @@ -473,7 +473,7 @@ if (inet_aton (host, &addr)) { /* check if its a multicast address */ if ((ntohl (addr.s_addr) & 0xe0000000) == 0xe0000000) { - printf ("multicast address detected\n"); + GST_DEBUG_OBJECT (sink, "multicast address detected"); client->multi_addr.imr_multiaddr.s_addr = addr.s_addr; client->multi_addr.imr_interface.s_addr = INADDR_ANY; |
From: <wt...@ke...> - 2006-09-21 09:50:58
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Sep 21 2006 09:50:53 UTC Log message: * gst/udp/README: * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): Update README, simple cleanup. Modified files: . : ChangeLog gst/udp : README gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2554&r2=1.2555 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/README.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.58&r2=1.59 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2554 retrieving revision 1.2555 diff -u -d -r1.2554 -r1.2555 --- ChangeLog 21 Sep 2006 09:35:13 -0000 1.2554 +++ ChangeLog 21 Sep 2006 09:50:41 -0000 1.2555 @@ -1,5 +1,11 @@ 2006-09-21 Wim Taymans <wi...@fl...> + * gst/udp/README: + * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): + Update README, simple cleanup. + +2006-09-21 Wim Taymans <wi...@fl...> * gst/rtp/README: Update README with some examples. Index: README RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/README,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- README 31 Jul 2003 11:16:20 -0000 1.3 +++ README 21 Sep 2006 09:50:41 -0000 1.4 @@ -1,25 +1,7 @@ * What is UDP src/sink? -This plugin is *not* meant to be a professional stream broadcast -solution, like icecast or realaudio or whatever. But the future RTP plugins shall not do the actual transmission/reception of packets on the network themselve but the Application developer would be encouraged to use these plugins for that. - -* Shortcomings -Even given our modest ambitions, the current code doesn't handle -caps negotiation robustly. -* Todo -The udp mode should include the caps every five packets -(approx). The tcp mode can do bi-directional negotiation. -Perhaps this plugin can be the example of how to do caps negotiation -via a point-to-point protocol. +It is a set of element to transfer data using UDP, nothing more, nothing less. +Its main purpose is to be used in conjunction with RTP but they are kept as +separate elements because we can. -Add some example of udpsrc/udpsink . -Update the man of gst-launch with some interesting pipelines . -12 Sep 2001 -Wim Taymans <wim...@ch...> -Joshua N Pritikin <vi...@po...> -Zeeshan Ali <za...@ya...> Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- gstudpsrc.c 31 Jul 2006 15:58:43 -0000 1.58 +++ gstudpsrc.c 21 Sep 2006 09:50:41 -0000 1.59 @@ -485,7 +485,7 @@ if (g_value_get_string (value) == NULL) udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); else - udpsrc->multi_group = g_strdup (g_value_get_string (value)); + udpsrc->multi_group = g_value_dup_string (value); gst_udpsrc_update_uri (udpsrc); break; case PROP_URI: |
From: <wt...@ke...> - 2006-09-29 08:09:38
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 29 2006 08:09:37 UTC Log message: Patch by: Antoine Tremblay <hexa00 at gmail dot com> * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Fix possible infinite loop when shutting down, a read can also return 0 to indicate no more messages are available. Fixes #358156. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2566&r2=1.2567 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.60&r2=1.61 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2566 retrieving revision 1.2567 diff -u -d -r1.2566 -r1.2567 --- ChangeLog 25 Sep 2006 13:55:44 -0000 1.2566 +++ ChangeLog 29 Sep 2006 08:09:24 -0000 1.2567 @@ -1,3 +1,11 @@ +2006-09-29 Wim Taymans <wi...@fl...> + + Patch by: Antoine Tremblay <hexa00 at gmail dot com> + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Fix possible infinite loop when shutting down, a read can also return + 0 to indicate no more messages are available. Fixes #358156. 2006-09-25 Wim Taymans <wi...@fl...> * gst/autodetect/gstautoaudiosink.c: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstudpsrc.c 25 Sep 2006 11:47:42 -0000 1.60 +++ gstudpsrc.c 29 Sep 2006 08:09:24 -0000 1.61 @@ -328,7 +328,7 @@ int res; READ_COMMAND (udpsrc, command, res); - if (res < 0) { + if (res <= 0) { GST_LOG_OBJECT (udpsrc, "no more commands"); /* no more commands */ break; |
From: <wt...@ke...> - 2006-09-29 11:09:53
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 29 2006 11:09:53 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_unlock), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Added property to post a message on timeout. Updated docs. When restarting the select, initialize the fdsets again. Init control sockets so we don't accidentally close a random socket. API: GstUDPSrc::timeout property Modified files: . : ChangeLog gst/udp : gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2568&r2=1.2569 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.61&r2=1.62 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2568 retrieving revision 1.2569 diff -u -d -r1.2568 -r1.2569 --- ChangeLog 29 Sep 2006 08:15:05 -0000 1.2568 +++ ChangeLog 29 Sep 2006 11:09:40 -0000 1.2569 @@ -1,5 +1,17 @@ 2006-09-29 Wim Taymans <wi...@fl...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_unlock), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Added property to post a message on timeout. + Updated docs. + When restarting the select, initialize the fdsets again. + Init control sockets so we don't accidentally close a random socket. + API: GstUDPSrc::timeout property + +2006-09-29 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type): Fix flag registration. Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- gstudpsrc.c 29 Sep 2006 08:09:24 -0000 1.61 +++ gstudpsrc.c 29 Sep 2006 11:09:40 -0000 1.62 @@ -80,7 +80,25 @@ * URIs. * </para> * <para> - * Last reviewed on 2006-07-27 (0.10.4) + * If the <link linkend="GstUDPSrc--timeout">timeout property</link> is set to a + * value bigger than 0, udpsrc will generate an element message named + * <classname>"GstUDPSrcTimeout"</classname>: + * if no data was recieved in the given timeout. + * The message's structure contains one field: + * <itemizedlist> + * <listitem> + * <para> + * #guint64 + * <classname>"timeout"</classname>: the timeout that expired when + * waiting for data. + * </para> + * </listitem> + * </itemizedlist> + * The message is typically used to detect that no UDP arrives in the receiver + * because it is blocked by a firewall. + * </para> + * <para> + * Last reviewed on 2006-09-29 (0.10.5) * </refsect2> */ @@ -109,10 +127,10 @@ #define WRITE_SOCKET(src) src->control_sock[1] #define READ_SOCKET(src) src->control_sock[0] -#define SEND_COMMAND(src, command) \ -G_STMT_START { \ - unsigned char c; c = command; \ - write (WRITE_SOCKET(src), &c, 1); \ +#define SEND_COMMAND(src, command, res) \ +G_STMT_START { \ + unsigned char c; c = command; \ + res = write (WRITE_SOCKET(src), &c, 1); \ } G_STMT_END #define READ_COMMAND(src, command, res) \ @@ -134,10 +152,11 @@ #define UDP_DEFAULT_PORT 4951 #define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" -#define UDP_DEFAULT_BUFFER_SIZE 0 #define UDP_DEFAULT_URI "udp://"UDP_DEFAULT_MULTICAST_GROUP":"G_STRINGIFY(UDP_DEFAULT_PORT) #define UDP_DEFAULT_CAPS NULL #define UDP_DEFAULT_SOCKFD -1 +#define UDP_DEFAULT_BUFFER_SIZE 0 +#define UDP_DEFAULT_TIMEOUT 0 enum { @@ -147,7 +166,8 @@ PROP_URI, PROP_CAPS, PROP_SOCKFD, - PROP_BUFFER_SIZE + PROP_BUFFER_SIZE, + PROP_TIMEOUT }; static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); @@ -228,6 +248,10 @@ g_param_spec_int ("buffer-size", "Buffer Size", "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, UDP_DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMEOUT, + g_param_spec_uint64 ("timeout", "Timeout", + "Post a message after this timeout (in microseconds) (0 = disabled)", + 0, G_MAXUINT64, UDP_DEFAULT_TIMEOUT, G_PARAM_READWRITE)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; @@ -248,6 +272,10 @@ udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); udpsrc->uri = g_strdup (UDP_DEFAULT_URI); udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; + udpsrc->timeout = UDP_DEFAULT_TIMEOUT; + udpsrc->control_sock[0] = -1; + udpsrc->control_sock[1] = -1; } static GstCaps * @@ -277,8 +305,7 @@ #ifdef G_OS_UNIX gint readsize; -#endif -#ifdef G_OS_WIN32 +#elif defined G_OS_WIN32 gulong readsize; #endif gint ret; @@ -286,32 +313,43 @@ udpsrc = GST_UDPSRC (psrc); - FD_ZERO (&read_fds); - FD_SET (udpsrc->sock, &read_fds); -#ifdef G_OS_UNIX - FD_SET (READ_SOCKET (udpsrc), &read_fds); - max_sock = MAX (udpsrc->sock, READ_SOCKET (udpsrc)); - do { gboolean stop; + struct timeval timeval, *timeout; + FD_ZERO (&read_fds); + FD_SET (udpsrc->sock, &read_fds); +#ifndef G_OS_WIN32 + FD_SET (READ_SOCKET (udpsrc), &read_fds); +#endif + max_sock = MAX (udpsrc->sock, READ_SOCKET (udpsrc)); try_again = FALSE; stop = FALSE; - GST_LOG_OBJECT (udpsrc, "doing select"); + GST_LOG_OBJECT (udpsrc, "doing select, timeout %" G_GUINT64_FORMAT, + udpsrc->timeout); + if (udpsrc->timeout > 0) { + timeval.tv_sec = udpsrc->timeout / 1000; + timeval.tv_usec = (udpsrc->timeout % 1000) * 1000; + timeout = &timeval; + } else { + timeout = NULL; + } #ifdef G_OS_WIN32 if (((max_sock + 1) != READ_SOCKET (udpsrc)) || ((max_sock + 1) != WRITE_SOCKET (udpsrc))) { - ret = select (max_sock + 1, &read_fds, NULL, NULL, NULL); + ret = select (max_sock + 1, &read_fds, NULL, NULL, timeout); } else { ret = 1; } #else - ret = select (max_sock + 1, &read_fds, NULL, NULL, NULL); + ret = select (max_sock + 1, &read_fds, NULL, NULL, timeout); GST_LOG_OBJECT (udpsrc, "select returned %d", ret); - if (ret <= 0) { + if (ret < 0) { if (WSAGetLastError () != WSAEINTR) goto select_error; @@ -320,6 +358,13 @@ try_again = TRUE; + } else if (ret == 0) { + /* timeout, post element message */ + gst_element_post_message (GST_ELEMENT_CAST (udpsrc), + gst_message_new_element (GST_OBJECT_CAST (udpsrc), + gst_structure_new ("GstUDPSrcTimeout", + "timeout", G_TYPE_UINT64, udpsrc->timeout, NULL))); + try_again = TRUE; if (FD_ISSET (READ_SOCKET (udpsrc), &read_fds)) { /* got control message */ @@ -353,7 +398,8 @@ goto stopped; } while (try_again); - /* ask how much is available for reading on the socket */ + /* ask how much is available for reading on the socket, this is exactly one + * UDP packet. */ if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) goto ioctl_failed; @@ -515,6 +561,9 @@ udpsrc->sock = g_value_get_int (value); GST_DEBUG ("setting SOCKFD to %d", udpsrc->sock); break; + case PROP_TIMEOUT: + udpsrc->timeout = g_value_get_uint64 (value); + break; default: } @@ -545,6 +594,9 @@ case PROP_SOCKFD: g_value_set_int (value, udpsrc->sock); + g_value_set_uint64 (value, udpsrc->timeout); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -729,11 +781,13 @@ gst_udpsrc_unlock (GstBaseSrc * bsrc) GstUDPSrc *src; + gint res; src = GST_UDPSRC (bsrc); GST_DEBUG ("sending stop command"); - SEND_COMMAND (src, CONTROL_STOP); + SEND_COMMAND (src, CONTROL_STOP, res); + GST_DEBUG ("sent stop command %d", res); return TRUE; @@ -745,6 +799,8 @@ + GST_DEBUG ("stopping, closing sockets"); if (src->sock != -1) { CLOSE_SOCKET (src->sock); src->sock = -1; Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstudpsrc.h 27 Jul 2006 10:05:27 -0000 1.19 +++ gstudpsrc.h 29 Sep 2006 11:09:40 -0000 1.20 @@ -52,19 +52,20 @@ GstPushSrc parent; /* properties */ - gchar *uri; - int port; - gchar *multi_group; - gint ttl; - gint buffer_size; - int sock; - int control_sock[2]; + gchar *uri; + int port; + gchar *multi_group; + gint ttl; + GstCaps *caps; + gint buffer_size; + guint64 timeout; - struct sockaddr_in myaddr; - struct ip_mreq multi_addr; + /* our sockets */ + int sock; + int control_sock[2]; - GstCaps *caps; + struct sockaddr_in myaddr; + struct ip_mreq multi_addr; struct _GstUDPSrcClass { |
From: <wt...@ke...> - 2006-10-11 08:34:31
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Oct 11 2006 08:34:26 UTC Log message: Patch by: Sebastien Cote <sebas642 at yahoo dot ca> * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_finalize), (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start): Fix some leaks in caps and uris. Fixes #361252. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2583&r2=1.2584 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.63&r2=1.64 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2583 retrieving revision 1.2584 diff -u -d -r1.2583 -r1.2584 --- ChangeLog 10 Oct 2006 08:29:06 -0000 1.2583 +++ ChangeLog 11 Oct 2006 08:34:14 -0000 1.2584 @@ -1,3 +1,12 @@ +2006-10-11 Wim Taymans <wi...@fl...> + + Patch by: Sebastien Cote <sebas642 at yahoo dot ca> + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_finalize), (gst_udpsrc_create), (gst_udpsrc_set_uri), + (gst_udpsrc_start): + Fix some leaks in caps and uris. Fixes #361252. 2006-10-10 Tim-Philipp Müller <tim at centricular dot net> * gst/wavparse/Makefile.am: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- gstudpsrc.c 29 Sep 2006 15:37:29 -0000 1.63 +++ gstudpsrc.c 11 Oct 2006 08:34:14 -0000 1.64 @@ -177,6 +177,7 @@ static gboolean gst_udpsrc_start (GstBaseSrc * bsrc); static gboolean gst_udpsrc_stop (GstBaseSrc * bsrc); static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc); +static void gst_udpsrc_finalize (GObject * object); static void gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -224,6 +225,7 @@ gobject_class->set_property = gst_udpsrc_set_property; gobject_class->get_property = gst_udpsrc_get_property; + gobject_class->finalize = gst_udpsrc_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, g_param_spec_int ("port", "Port", @@ -278,6 +280,21 @@ udpsrc->control_sock[1] = -1; } +static void +gst_udpsrc_finalize (GObject * object) +{ + GstUDPSrc *udpsrc; + udpsrc = GST_UDPSRC (object); + if (udpsrc->caps) + gst_caps_unref (udpsrc->caps); + g_free (udpsrc->multi_group); + g_free (udpsrc->uri); + G_OBJECT_CLASS (parent_class)->finalize (object); +} static GstCaps * gst_udpsrc_getcaps (GstBaseSrc * src) { @@ -408,8 +425,8 @@ pktdata = g_malloc (readsize); pktsize = readsize; - len = sizeof (struct sockaddr); while (TRUE) { + len = sizeof (struct sockaddr); ret = recvfrom (udpsrc->sock, pktdata, pktsize, 0, (struct sockaddr *) &tmpaddr, &len); if (ret < 0) { @@ -503,11 +520,12 @@ return TRUE; + /* ERRORS */ wrong_protocol: { g_free (protocol); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), - ("error parsing uri %s: wrong protocol", uri)); + ("error parsing uri %s: wrong protocol (%s != udp)", uri, protocol)); return FALSE; } @@ -652,8 +670,7 @@ src->myaddr.sin_addr.s_addr = INADDR_ANY; GST_DEBUG_OBJECT (src, "binding on port %d", src->port); - if ((ret = - bind (src->sock, (struct sockaddr *) &src->myaddr, + if ((ret = bind (src->sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr))) < 0) goto bind_error; @@ -661,8 +678,7 @@ if (inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) { if (src->multi_addr.imr_multiaddr.s_addr) { src->multi_addr.imr_interface.s_addr = INADDR_ANY; - if ((ret = - setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, + if ((ret = setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr, sizeof (src->multi_addr))) < 0) goto membership; } @@ -695,8 +711,7 @@ GST_DEBUG_OBJECT (src, "could not get udp buffer size"); bc_val = 1; - if ((ret = - setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, + if ((ret = setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val))) < 0) goto no_broadcast; |
From: <wt...@ke...> - 2006-12-06 14:34:09
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Dec 06 2006 14:34:06 UTC Log message: Patch by: Rob Taylor <robtaylor at floopily dot org> * gst/udp/gstudpsrc.c: (gst_udpsrc_start): If using multicast in udpsrc, bind to the multicast address rather than IN_ADDR_ANY. This allows the simultanous use of multiple udpsrcs listening on different multicat addresses. Without this all udpsrcs will receive all packets from all subscribed multicast addresses. Fixes #383001. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2645&r2=1.2646 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.65&r2=1.66 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2645 retrieving revision 1.2646 diff -u -d -r1.2645 -r1.2646 --- ChangeLog 6 Dec 2006 13:35:51 -0000 1.2645 +++ ChangeLog 6 Dec 2006 14:33:53 -0000 1.2646 @@ -1,3 +1,15 @@ +2006-12-06 Wim Taymans <wi...@fl...> + + Patch by: Rob Taylor <robtaylor at floopily dot org> + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + If using multicast in udpsrc, bind to the multicast address rather than + IN_ADDR_ANY. + This allows the simultanous use of multiple udpsrcs listening on + different multicat addresses. Without this all udpsrcs will receive all + packets from all subscribed multicast addresses. + Fixes #383001. 2006-12-06 Jan Schmidt <th...@ma...> * ext/taglib/gstid3v2mux.cc: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- gstudpsrc.c 16 Oct 2006 18:22:47 -0000 1.65 +++ gstudpsrc.c 6 Dec 2006 14:33:54 -0000 1.66 @@ -652,8 +652,11 @@ fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); #endif + if (!inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) + src->multi_addr.imr_multiaddr.s_addr = 0; if (src->sock == -1) { - if ((ret = socket (AF_INET, SOCK_DGRAM, 0)) < 0) + if ((ret = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) goto no_socket; src->sock = ret; @@ -667,7 +670,11 @@ memset (&src->myaddr, 0, sizeof (src->myaddr)); src->myaddr.sin_family = AF_INET; /* host byte order */ src->myaddr.sin_port = htons (src->port); /* short, network byte order */ - src->myaddr.sin_addr.s_addr = INADDR_ANY; + if (src->multi_addr.imr_multiaddr.s_addr) + src->myaddr.sin_addr.s_addr = src->multi_addr.imr_multiaddr.s_addr; + else + src->myaddr.sin_addr.s_addr = INADDR_ANY; GST_DEBUG_OBJECT (src, "binding on port %d", src->port); if ((ret = bind (src->sock, (struct sockaddr *) &src->myaddr, @@ -675,13 +682,12 @@ goto bind_error; } - if (inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) { - if (src->multi_addr.imr_multiaddr.s_addr) { - src->multi_addr.imr_interface.s_addr = INADDR_ANY; - if ((ret = setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, - &src->multi_addr, sizeof (src->multi_addr))) < 0) - goto membership; - } + if (src->multi_addr.imr_multiaddr.s_addr) { + src->multi_addr.imr_interface.s_addr = INADDR_ANY; + if ((ret = + setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, + &src->multi_addr, sizeof (src->multi_addr))) < 0) + goto membership; len = sizeof (my_addr); |
From: <wt...@ke...> - 2007-03-02 12:56:29
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Mar 02 2007 12:56:26 UTC Log message: Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property): * gst/udp/gstudpsrc.h: Add support to strip proprietary headers. Fixes #350296. Modified files: . : ChangeLog gst/udp : gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2776&r2=1.2777 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.68&r2=1.69 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.20&r2=1.21 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2776 retrieving revision 1.2777 diff -u -d -r1.2776 -r1.2777 --- ChangeLog 2 Mar 2007 12:52:55 -0000 1.2776 +++ ChangeLog 2 Mar 2007 12:56:13 -0000 1.2777 @@ -1,5 +1,15 @@ 2007-03-02 Wim Taymans <wi...@fl...> + Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> + + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property): + * gst/udp/gstudpsrc.h: + Add support to strip proprietary headers. Fixes #350296. +2007-03-02 Wim Taymans <wi...@fl...> * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): Fix compilation. Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- gstudpsrc.c 11 Feb 2007 12:57:47 -0000 1.68 +++ gstudpsrc.c 2 Mar 2007 12:56:13 -0000 1.69 @@ -71,6 +71,10 @@ * default buffer size is typically 50K and can be increased to maximally 100K. * </para> * <para> + * The "skip-first-bytes" property is used to strip off an arbitrary number of + * bytes from the start of the raw udp packet and can be used to . + * </para> + * <para> * The udpsrc is always a live source. It does however not provide a GstClock, this * is left for upstream elements such as an RTP session manager or demuxer (such * as an MPEG demuxer). @@ -98,7 +102,7 @@ * because it is blocked by a firewall. - * Last reviewed on 2006-09-29 (0.10.5) + * Last reviewed on 2007-03-02 (0.10.6) * </refsect2> */ @@ -160,6 +164,7 @@ #define UDP_DEFAULT_SOCKFD -1 #define UDP_DEFAULT_BUFFER_SIZE 0 #define UDP_DEFAULT_TIMEOUT 0 +#define UDP_DEFAULT_SKIP_FIRST_BYTES 0 enum { @@ -170,7 +175,8 @@ PROP_CAPS, PROP_SOCKFD, PROP_BUFFER_SIZE, - PROP_TIMEOUT + PROP_TIMEOUT, + PROP_SKIP_FIRST_BYTES }; static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); @@ -257,6 +263,10 @@ g_param_spec_uint64 ("timeout", "Timeout", "Post a message after timeout microseconds (0 = disabled)", 0, G_MAXUINT64, UDP_DEFAULT_TIMEOUT, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SKIP_FIRST_BYTES, g_param_spec_int ("skip-first-bytes", + "Skip first bytes", "number of bytes to skip for each udp packet", 0, + G_MAXINT, UDP_DEFAULT_SKIP_FIRST_BYTES, G_PARAM_READWRITE)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; @@ -278,6 +288,7 @@ udpsrc->uri = g_strdup (UDP_DEFAULT_URI); udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; udpsrc->timeout = UDP_DEFAULT_TIMEOUT; + udpsrc->skip_first_bytes = UDP_DEFAULT_SKIP_FIRST_BYTES; udpsrc->control_sock[0] = -1; udpsrc->control_sock[1] = -1; @@ -320,7 +331,7 @@ socklen_t len; fd_set read_fds; guint max_sock; - gchar *pktdata; + guint8 *pktdata; gint pktsize; #ifdef G_OS_UNIX @@ -441,8 +452,17 @@ /* special case buffer so receivers can also track the address */ outbuf = gst_netbuffer_new (); - GST_BUFFER_DATA (outbuf) = (guint8 *) pktdata; - GST_BUFFER_MALLOCDATA (outbuf) = (guint8 *) pktdata; + GST_BUFFER_MALLOCDATA (outbuf) = pktdata; + /* patch pktdata and len when stripping off the headers */ + if (udpsrc->skip_first_bytes != 0) { + if (G_UNLIKELY (readsize <= udpsrc->skip_first_bytes)) + goto skip_error; + pktdata += udpsrc->skip_first_bytes; + ret -= udpsrc->skip_first_bytes; + } + GST_BUFFER_DATA (outbuf) = pktdata; GST_BUFFER_SIZE (outbuf) = ret; gst_netaddress_set_ip4_address (&outbuf->from, tmpaddr.sin_addr.s_addr, @@ -481,6 +501,12 @@ ("receive error %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } +skip_error: + { + GST_ELEMENT_ERROR (udpsrc, STREAM, DECODE, (NULL), + ("UDP buffer to small to skip header")); + return GST_FLOW_ERROR; } /* Call this function when multicastgroup and/or port are updated */ @@ -585,6 +611,9 @@ case PROP_TIMEOUT: udpsrc->timeout = g_value_get_uint64 (value); break; + case PROP_SKIP_FIRST_BYTES: + udpsrc->skip_first_bytes = g_value_get_int (value); + break; default: @@ -618,6 +647,9 @@ g_value_set_uint64 (value, udpsrc->timeout); + g_value_set_int (value, udpsrc->skip_first_bytes); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstudpsrc.h 29 Sep 2006 11:09:40 -0000 1.20 +++ gstudpsrc.h 2 Mar 2007 12:56:13 -0000 1.21 @@ -59,6 +59,7 @@ GstCaps *caps; gint buffer_size; guint64 timeout; + gint skip_first_bytes; /* our sockets */ int sock; |
From: <wt...@ke...> - 2007-03-02 13:40:23
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Mar 02 2007 13:40:18 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create): Fix doc. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2779&r2=1.2780 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.69&r2=1.70 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2779 retrieving revision 1.2780 diff -u -d -r1.2779 -r1.2780 --- ChangeLog 2 Mar 2007 13:29:24 -0000 1.2779 +++ ChangeLog 2 Mar 2007 13:40:05 -0000 1.2780 @@ -1,3 +1,9 @@ +2007-03-02 Wim Taymans <wi...@fl...> + + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create): + Fix doc. 2007-03-02 Stefan Kost <en...@us...> Patch by: René Stadler <ma...@re...> Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -d -r1.69 -r1.70 --- gstudpsrc.c 2 Mar 2007 12:56:13 -0000 1.69 +++ gstudpsrc.c 2 Mar 2007 13:40:06 -0000 1.70 @@ -72,7 +72,8 @@ * </para> * <para> * The "skip-first-bytes" property is used to strip off an arbitrary number of - * bytes from the start of the raw udp packet and can be used to . + * bytes from the start of the raw udp packet and can be used to strip off + * proprietary header, for example. * The udpsrc is always a live source. It does however not provide a GstClock, this |
From: <wt...@ke...> - 2007-03-29 09:59:40
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Mar 29 2007 09:59:35 UTC Log message: Patch by: Laurent Glayal <spglegle at yahoo dot fr> * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init), (gst_dynudpsink_init), (gst_dynudpsink_set_property), (gst_dynudpsink_get_property), (gst_dynudpsink_init_send), (gst_dynudpsink_close): * gst/udp/gstdynudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Rework the socket allocation a bit based on the sockfd argument so that it becomes usable. Add a closefd property to instruct the udp elements to close the custom file descriptors when going to READY. Fixes #423304. API:GstUDPSrc::closefd property API:GstDynUDPSink::closefd property Modified files: . : ChangeLog gst/udp : gstdynudpsink.c gstdynudpsink.h gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2841&r2=1.2842 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstdynudpsink.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstdynudpsink.h.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.70&r2=1.71 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2841 retrieving revision 1.2842 diff -u -d -r1.2841 -r1.2842 --- ChangeLog 29 Mar 2007 08:08:48 -0000 1.2841 +++ ChangeLog 29 Mar 2007 09:59:22 -0000 1.2842 @@ -2,6 +2,26 @@ Patch by: Laurent Glayal <spglegle at yahoo dot fr> + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init), + (gst_dynudpsink_init), (gst_dynudpsink_set_property), + (gst_dynudpsink_get_property), (gst_dynudpsink_init_send), + (gst_dynudpsink_close): + * gst/udp/gstdynudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Rework the socket allocation a bit based on the sockfd argument so that + it becomes usable. + Add a closefd property to instruct the udp elements to close the custom + file descriptors when going to READY. Fixes #423304. + API:GstUDPSrc::closefd property + API:GstDynUDPSink::closefd property + +2007-03-29 Wim Taymans <wi...@fl...> + Patch by: Laurent Glayal <spglegle at yahoo dot fr> * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init), Index: gstdynudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstdynudpsink.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstdynudpsink.c 24 Jul 2006 11:48:03 -0000 1.11 +++ gstdynudpsink.c 29 Mar 2007 09:59:23 -0000 1.12 @@ -29,6 +29,11 @@ GST_DEBUG_CATEGORY_STATIC (dynudpsink_debug); #define GST_CAT_DEFAULT (dynudpsink_debug) +#define CLOSE_IF_REQUESTED(udpctx) \ + if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \ + CLOSE_SOCKET(udpctx->sock); \ + udpctx->sock = -1; static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -53,11 +58,14 @@ LAST_SIGNAL }; +#define UDP_DEFAULT_SOCKFD -1 +#define UDP_DEFAULT_CLOSEFD TRUE enum { PROP_0, - PROP_SOCKFD - /* FILL ME */ + PROP_SOCKFD, + PROP_CLOSEFD static void gst_dynudpsink_base_init (gpointer g_class); @@ -142,8 +150,12 @@ g_object_class_install_property (gobject_class, PROP_SOCKFD, g_param_spec_int ("sockfd", "socket handle", - "Socket to use for UDP reception.", - 0, G_MAXINT16, 0, G_PARAM_READWRITE)); + "Socket to use for UDP sending. (-1 == allocate)", + -1, G_MAXINT16, UDP_DEFAULT_SOCKFD, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_CLOSEFD, + g_param_spec_boolean ("closefd", "Close sockfd", + "Close sockfd if passed as property on state change", + UDP_DEFAULT_CLOSEFD, G_PARAM_READWRITE)); gstelement_class->change_state = gst_dynudpsink_change_state; @@ -152,7 +164,6 @@ GST_DEBUG_CATEGORY_INIT (dynudpsink_debug, "dynudpsink", 0, "UDP sink"); } - static void gst_dynudpsink_init (GstDynUDPSink * sink) @@ -162,6 +173,10 @@ udpsink = GST_DYNUDPSINK (sink); + sink->sockfd = UDP_DEFAULT_SOCKFD; + sink->closefd = UDP_DEFAULT_CLOSEFD; + sink->externalfd = FALSE; sink->sock = -1; @@ -238,8 +253,11 @@ switch (prop_id) { case PROP_SOCKFD: - udpsink->sock = g_value_get_int (value); - GST_DEBUG ("setting SOCKFD to %d", udpsink->sock); + udpsink->sockfd = g_value_get_int (value); + GST_DEBUG ("setting SOCKFD to %d", udpsink->sockfd); + break; + case PROP_CLOSEFD: + udpsink->closefd = g_value_get_boolean (value); break; default: @@ -258,9 +276,11 @@ - g_value_set_int (value, udpsink->sock); + g_value_set_int (value, udpsink->sockfd); + g_value_set_boolean (value, udpsink->closefd); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -275,9 +295,8 @@ guint bc_val; gint ret; - if (sink->sock == -1) { + if (sink->sockfd == -1) { /* create sender socket if none available */ if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) goto no_socket; @@ -286,8 +305,12 @@ setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val))) < 0) goto no_broadcast; - } + sink->externalfd = TRUE; + } else { + sink->sock = sink->sockfd; + } return TRUE; /* ERRORS */ @@ -299,6 +322,7 @@ no_broadcast: { perror ("setsockopt"); + CLOSE_IF_REQUESTED (sink); return FALSE; } @@ -312,7 +336,8 @@ gst_dynudpsink_close (GstDynUDPSink * sink) - CLOSE_SOCKET (sink->sock); + if (sink->sock != -1) static GstStateChangeReturn Index: gstdynudpsink.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstdynudpsink.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstdynudpsink.h 11 Feb 2007 12:57:47 -0000 1.5 +++ gstdynudpsink.h 29 Mar 2007 09:59:23 -0000 1.6 @@ -54,7 +54,13 @@ struct _GstDynUDPSink { GstBaseSink parent; + /* properties */ + gint sockfd; + gboolean closefd; + /* the socket in use */ int sock; + gboolean externalfd; struct _GstDynUDPSinkClass { Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.70 retrieving revision 1.71 diff -u -d -r1.70 -r1.71 --- gstudpsrc.c 2 Mar 2007 13:40:06 -0000 1.70 +++ gstudpsrc.c 29 Mar 2007 09:59:23 -0000 1.71 @@ -103,7 +103,14 @@ * because it is blocked by a firewall. * </para> * <para> - * Last reviewed on 2007-03-02 (0.10.6) + * A custom file descriptor can be configured with the + * <link linkend="GstUDPSrc--sockfd">sockfd property</link>. The socket will be + * closed when setting the element to READY by default. This behaviour can be + * overriden with the <link linkend="GstUDPSrc--closefd">closefd property</link>, + * in which case the application is responsible for closing the file descriptor. + * </para> + * <para> + * Last reviewed on 2007-03-29 (0.10.6) * </refsect2> */ @@ -146,6 +153,11 @@ res = read(READ_SOCKET(src), &command, 1); \ } G_STMT_END +#define CLOSE_IF_REQUESTED(udpctx) \ + if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \ + CLOSE_SOCKET(udpctx->sock); \ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -166,6 +178,7 @@ #define UDP_DEFAULT_BUFFER_SIZE 0 #define UDP_DEFAULT_TIMEOUT 0 #define UDP_DEFAULT_SKIP_FIRST_BYTES 0 +#define UDP_DEFAULT_CLOSEFD TRUE @@ -177,7 +190,8 @@ PROP_SOCKFD, PROP_BUFFER_SIZE, PROP_TIMEOUT, - PROP_SKIP_FIRST_BYTES + PROP_SKIP_FIRST_BYTES, static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); @@ -268,6 +282,10 @@ PROP_SKIP_FIRST_BYTES, g_param_spec_int ("skip-first-bytes", "Skip first bytes", "number of bytes to skip for each udp packet", 0, G_MAXINT, UDP_DEFAULT_SKIP_FIRST_BYTES, G_PARAM_READWRITE)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; @@ -284,13 +302,16 @@ gst_base_src_set_live (GST_BASE_SRC (udpsrc), TRUE); udpsrc->port = UDP_DEFAULT_PORT; - udpsrc->sock = UDP_DEFAULT_SOCKFD; + udpsrc->sockfd = UDP_DEFAULT_SOCKFD; udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); udpsrc->uri = g_strdup (UDP_DEFAULT_URI); udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; udpsrc->timeout = UDP_DEFAULT_TIMEOUT; udpsrc->skip_first_bytes = UDP_DEFAULT_SKIP_FIRST_BYTES; + udpsrc->closefd = UDP_DEFAULT_CLOSEFD; + udpsrc->externalfd = (udpsrc->sockfd != -1); + udpsrc->sock = -1; udpsrc->control_sock[0] = -1; udpsrc->control_sock[1] = -1; @@ -606,8 +627,8 @@ } - udpsrc->sock = g_value_get_int (value); - GST_DEBUG ("setting SOCKFD to %d", udpsrc->sock); + udpsrc->sockfd = g_value_get_int (value); + GST_DEBUG ("setting SOCKFD to %d", udpsrc->sockfd); case PROP_TIMEOUT: udpsrc->timeout = g_value_get_uint64 (value); @@ -615,6 +636,9 @@ case PROP_SKIP_FIRST_BYTES: udpsrc->skip_first_bytes = g_value_get_int (value); + udpsrc->closefd = g_value_get_boolean (value); @@ -643,7 +667,7 @@ gst_value_set_caps (value, udpsrc->caps); - g_value_set_int (value, udpsrc->sock); + g_value_set_int (value, udpsrc->sockfd); g_value_set_uint64 (value, udpsrc->timeout); @@ -651,6 +675,9 @@ g_value_set_int (value, udpsrc->skip_first_bytes); + g_value_set_boolean (value, udpsrc->closefd); @@ -691,11 +718,13 @@ if (!inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) src->multi_addr.imr_multiaddr.s_addr = 0; - if (src->sock == -1) { + if (src->sockfd == -1) { + /* need to allocate a socket */ if ((ret = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) src->sock = ret; + src->externalfd = FALSE; reuse = 1; if ((ret = @@ -716,6 +745,10 @@ if ((ret = bind (src->sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr))) < 0) goto bind_error; + /* we use the configured socket */ + src->sock = src->sockfd; + src->externalfd = TRUE; if (src->multi_addr.imr_multiaddr.s_addr) { @@ -784,40 +817,35 @@ setsockopt_error: - CLOSE_SOCKET (src->sock); - src->sock = -1; + CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("setsockopt failed %d: %s (%d)", ret, g_strerror (errno), errno)); bind_error: ("bind failed %d: %s (%d)", ret, g_strerror (errno), errno)); membership: ("could add membership %d: %s (%d)", ret, g_strerror (errno), errno)); getsockname_error: ("getsockname failed %d: %s (%d)", ret, g_strerror (errno), errno)); udpbuffer_error: ("Could not create a buffer of the size requested, %d: %s (%d)", ret, g_strerror (errno), errno)); @@ -825,8 +853,7 @@ ("could not configure socket for broadcast %d: %s (%d)", ret, @@ -859,8 +886,7 @@ GST_DEBUG ("stopping, closing sockets"); if (src->sock != -1) { /* pipes on WIN32 else sockets */ Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstudpsrc.h 2 Mar 2007 12:56:13 -0000 1.21 +++ gstudpsrc.h 29 Mar 2007 09:59:23 -0000 1.22 @@ -60,10 +60,13 @@ gint buffer_size; guint64 timeout; gint skip_first_bytes; + int sockfd; /* our sockets */ int sock; int control_sock[2]; struct sockaddr_in myaddr; struct ip_mreq multi_addr; |
From: <wt...@ke...> - 2007-04-11 10:25:42
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Apr 11 2007 10:25:37 UTC Log message: * gst/udp/gstudp.c: (plugin_init): Register GstNetBuffer in plugin_init so that the type can be used from multiple threads without races. Modified files: . : ChangeLog gst/udp : gstudp.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2856&r2=1.2857 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudp.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2856 retrieving revision 1.2857 diff -u -d -r1.2856 -r1.2857 --- ChangeLog 10 Apr 2007 17:06:04 -0000 1.2856 +++ ChangeLog 11 Apr 2007 10:25:25 -0000 1.2857 @@ -1,3 +1,9 @@ +2007-04-11 Wim Taymans <wi...@fl...> + + * gst/udp/gstudp.c: (plugin_init): + Register GstNetBuffer in plugin_init so that the type can be used from + multiple threads without races. 2007-04-10 Wim Taymans <wi...@fl...> * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), Index: gstudp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudp.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstudp.c 24 Jul 2006 11:48:03 -0000 1.12 +++ gstudp.c 11 Apr 2007 10:25:25 -0000 1.13 @@ -21,6 +21,8 @@ #include "config.h" #endif +#include <gst/netbuffer/gstnetbuffer.h> #include "gstudpsrc.h" #include "gstmultiudpsink.h" #include "gstudpsink.h" @@ -34,6 +36,10 @@ return FALSE; + /* register type of the netbuffer so that we can use it from multiple threads + * right away. Note that the plugin loading is always serialized */ + gst_netbuffer_get_type (); if (!gst_element_register (plugin, "udpsink", GST_RANK_NONE, GST_TYPE_UDPSINK)) |
From: <wt...@ke...> - 2007-04-26 08:48:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Apr 26 2007 08:48:42 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Handle the case where there are exactly 0 bytes to read and the ioctl did not report an error. Fixes #433530. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2881&r2=1.2882 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.71&r2=1.72 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2881 retrieving revision 1.2882 diff -u -d -r1.2881 -r1.2882 --- ChangeLog 26 Apr 2007 08:39:48 -0000 1.2881 +++ ChangeLog 26 Apr 2007 08:48:29 -0000 1.2882 @@ -1,5 +1,11 @@ 2007-04-26 Wim Taymans <wi...@fl...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Handle the case where there are exactly 0 bytes to read and the ioctl + did not report an error. Fixes #433530. + +2007-04-26 Wim Taymans <wi...@fl...> * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): * gst/wavparse/gstwavparse.h: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.71 retrieving revision 1.72 diff -u -d -r1.71 -r1.72 --- gstudpsrc.c 29 Mar 2007 09:59:23 -0000 1.71 +++ gstudpsrc.c 26 Apr 2007 08:48:30 -0000 1.72 @@ -451,13 +451,18 @@ goto stopped; } while (try_again); - /* ask how much is available for reading on the socket, this is exactly one - * UDP packet. */ + /* ask how much is available for reading on the socket, this should be exactly + * one UDP packet. We will check the return value, though, because in some + * case it can return 0 and we don't want a 0 sized buffer. */ + readsize = 0; if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) goto ioctl_failed; GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); + if (!readsize) + goto nothing_to_read; pktdata = g_malloc (readsize); pktsize = readsize; @@ -516,6 +521,13 @@ ("ioctl failed %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } +nothing_to_read: + { + GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), + ("ioctl returned readsize 0 %d: %s (%d)", ret, g_strerror (errno), + errno)); + return GST_FLOW_ERROR; + } receive_error: { g_free (pktdata); |
From: <wt...@ke...> - 2007-04-29 12:19:40
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Sun Apr 29 2007 12:19:33 UTC Log message: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): Fix multicast detection. Don't try to join a multicast group if the address is not multicast. * gst/udp/gstudpsrc.c: (gst_udpsrc_update_uri): Small debug improvement. Modified files: . : ChangeLog gst/udp : gstmultiudpsink.c gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2886&r2=1.2887 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.72&r2=1.73 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2886 retrieving revision 1.2887 diff -u -d -r1.2886 -r1.2887 --- ChangeLog 27 Apr 2007 16:44:17 -0000 1.2886 +++ ChangeLog 29 Apr 2007 12:19:21 -0000 1.2887 @@ -1,3 +1,12 @@ +2007-04-29 Wim Taymans <wi...@fl...> + + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): + Fix multicast detection. + Don't try to join a multicast group if the address is not multicast. + * gst/udp/gstudpsrc.c: (gst_udpsrc_update_uri): + Small debug improvement. 2007-04-27 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), Index: gstmultiudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstmultiudpsink.c 10 Apr 2007 10:01:14 -0000 1.19 +++ gstmultiudpsink.c 29 Apr 2007 12:19:21 -0000 1.20 @@ -478,18 +478,19 @@ /* if its an IP address */ if (inet_aton (host, &addr)) { /* check if its a multicast address */ - if ((ntohl (addr.s_addr) & 0xe0000000) == 0xe0000000) { - GST_DEBUG_OBJECT (sink, "multicast address detected"); + if ((ntohl (addr.s_addr) & 0xf0000000) == 0xe0000000) { + GST_DEBUG_OBJECT (sink, "multicast address detected"); client->multi_addr.imr_multiaddr.s_addr = addr.s_addr; client->multi_addr.imr_interface.s_addr = INADDR_ANY; client->theiraddr.sin_addr = client->multi_addr.imr_multiaddr; } else { + GST_DEBUG_OBJECT (sink, "normal address detected"); client->theiraddr.sin_addr = *((struct in_addr *) &addr); } /* if init_send has already been called, set sockopts for multicast */ - if (*client->sock > 0) + if (*client->sock > 0 && client->multi_addr.imr_multiaddr.s_addr) join_multicast (client); } /* we dont need to lookup for localhost */ Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- gstudpsrc.c 26 Apr 2007 08:48:30 -0000 1.72 +++ gstudpsrc.c 29 Apr 2007 12:19:21 -0000 1.73 @@ -550,6 +550,8 @@ { g_free (src->uri); src->uri = g_strdup_printf ("udp://%s:%d", src->multi_group, src->port); + GST_DEBUG_OBJECT (src, "updated uri to %s", src->uri); } static gboolean |
From: <wt...@ke...> - 2007-05-21 10:07:26
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon May 21 2007 10:07:18 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop): Since we depend on 0.10.13 -core, override the unlock_stop vmethod for safer shutdown. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2939&r2=1.2940 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.73&r2=1.74 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2939 retrieving revision 1.2940 diff -u -d -r1.2939 -r1.2940 --- ChangeLog 21 May 2007 10:03:39 -0000 1.2939 +++ ChangeLog 21 May 2007 10:07:05 -0000 1.2940 @@ -1,5 +1,12 @@ 2007-05-21 Wim Taymans <wi...@fl...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop): + Since we depend on 0.10.13 -core, override the unlock_stop vmethod for + safer shutdown. + +2007-05-21 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_class_init): * gst/rtsp/gstrtpdec.h: Added signal for backwards compat. Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.73 retrieving revision 1.74 diff -u -d -r1.73 -r1.74 --- gstudpsrc.c 29 Apr 2007 12:19:21 -0000 1.73 +++ gstudpsrc.c 21 May 2007 10:07:05 -0000 1.74 @@ -201,6 +201,7 @@ static gboolean gst_udpsrc_start (GstBaseSrc * bsrc); static gboolean gst_udpsrc_stop (GstBaseSrc * bsrc); static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc); +static gboolean gst_udpsrc_unlock_stop (GstBaseSrc * bsrc); static void gst_udpsrc_finalize (GObject * object); static void gst_udpsrc_set_property (GObject * object, guint prop_id, @@ -290,6 +291,7 @@ gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; gstbasesrc_class->unlock = gst_udpsrc_unlock; + gstbasesrc_class->unlock_stop = gst_udpsrc_unlock_stop; gstbasesrc_class->get_caps = gst_udpsrc_getcaps; gstpushsrc_class->create = gst_udpsrc_create; @@ -419,36 +421,9 @@ "timeout", G_TYPE_UINT64, udpsrc->timeout, NULL))); try_again = TRUE; } else { - if (FD_ISSET (READ_SOCKET (udpsrc), &read_fds)) { - /* got control message */ - while (TRUE) { - gchar command; - int res; - - READ_COMMAND (udpsrc, command, res); - if (res <= 0) { - GST_LOG_OBJECT (udpsrc, "no more commands"); - /* no more commands */ - break; - } - switch (command) { - case CONTROL_STOP: - /* break out of the select loop */ - GST_LOG_OBJECT (udpsrc, "stop"); - /* stop this function */ - stop = TRUE; - break; - default: - GST_WARNING_OBJECT (udpsrc, "unkown"); - g_warning ("multiudpsink: unknown control message received"); - } - } + if (FD_ISSET (READ_SOCKET (udpsrc), &read_fds)) + goto stopped; } - if (stop) - goto stopped; } while (try_again); /* ask how much is available for reading on the socket, this should be exactly @@ -883,9 +858,35 @@ src = GST_UDPSRC (bsrc); - GST_DEBUG ("sending stop command"); + GST_LOG_OBJECT (src, "sending stop command"); SEND_COMMAND (src, CONTROL_STOP, res); - GST_DEBUG ("sent stop command %d", res); + GST_LOG_OBJECT (src, "sent stop command %d", res); + return TRUE; +} +static gboolean +gst_udpsrc_unlock_stop (GstBaseSrc * bsrc) +{ + GstUDPSrc *src; + src = GST_UDPSRC (bsrc); + GST_LOG_OBJECT (src, "clearing unlock command queue"); + while (TRUE) { + gchar command; + int res; + GST_LOG_OBJECT (src, "reading command"); + READ_COMMAND (src, command, res); + if (res <= 0) { + GST_LOG_OBJECT (src, "no more commands"); + /* no more commands */ + break; + } + } return TRUE; } |
From: <wt...@ke...> - 2007-08-16 11:49:24
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Aug 16 2007 11:49:15 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Improve UDP performance by avoiding a select() when we have data available immediatly. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3050&r2=1.3051 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.74&r2=1.75 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3050 retrieving revision 1.3051 diff -u -d -r1.3050 -r1.3051 --- ChangeLog 16 Aug 2007 11:47:19 -0000 1.3050 +++ ChangeLog 16 Aug 2007 11:49:01 -0000 1.3051 @@ -1,5 +1,11 @@ 2007-08-16 Wim Taymans <wim...@gm...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Improve UDP performance by avoiding a select() when we have data + available immediatly. + +2007-08-16 Wim Taymans <wim...@gm...> * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_VOID__UINT_UINT), (gst_rtp_dec_class_init): * gst/rtsp/gstrtpdec.h: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- gstudpsrc.c 21 May 2007 10:07:05 -0000 1.74 +++ gstudpsrc.c 16 Aug 2007 11:49:01 -0000 1.75 @@ -368,6 +368,14 @@ udpsrc = GST_UDPSRC (psrc); + /* quick check, avoid going in select when we already have data */ + readsize = 0; + if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) + goto ioctl_failed; + if (readsize > 0) + goto no_select; do { gboolean stop; struct timeval timeval, *timeout; @@ -433,11 +441,12 @@ if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) goto ioctl_failed; - GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); - if (!readsize) goto nothing_to_read; +no_select: + GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); pktdata = g_malloc (readsize); pktsize = readsize; |
From: <wt...@ke...> - 2007-09-04 22:42:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Sep 04 2007 22:42:35 UTC Log message: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_set_clients_string), (gst_multiudpsink_get_clients_string), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), (gst_multiudpsink_add), (gst_multiudpsink_clear_internal), (gst_multiudpsink_clear): Add property do configure destination address/port pairs API:GstMultiUDPSink::clients Modified files: . : ChangeLog gst/udp : gstmultiudpsink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3073&r2=1.3074 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c.diff?r1=1.22&r2=1.23 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3073 retrieving revision 1.3074 diff -u -d -r1.3073 -r1.3074 --- ChangeLog 4 Sep 2007 18:30:15 -0000 1.3073 +++ ChangeLog 4 Sep 2007 22:42:20 -0000 1.3074 @@ -1,5 +1,17 @@ 2007-09-04 Wim Taymans <wim...@gm...> + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_set_clients_string), + (gst_multiudpsink_get_clients_string), + (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), + (gst_multiudpsink_add), (gst_multiudpsink_clear_internal), + (gst_multiudpsink_clear): + Add property do configure destination address/port pairs + API:GstMultiUDPSink::clients + +2007-09-04 Wim Taymans <wim...@gm...> * tests/examples/Makefile.am: * tests/examples/rtp/Makefile.am: * tests/examples/rtp/client-H263p-AMR.sh: Index: gstmultiudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstmultiudpsink.c 17 Aug 2007 13:59:15 -0000 1.22 +++ gstmultiudpsink.c 4 Sep 2007 22:42:21 -0000 1.23 @@ -71,6 +71,7 @@ #define DEFAULT_SOCKFD -1 #define DEFAULT_CLOSEFD TRUE #define DEFAULT_SOCK -1 +#define DEFAULT_CLIENTS NULL enum { @@ -79,7 +80,8 @@ PROP_BYTES_SERVED, PROP_SOCKFD, PROP_CLOSEFD, - PROP_SOCK + PROP_SOCK, + PROP_CLIENTS /* FILL ME */ }; @@ -103,6 +105,11 @@ static void gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_multiudpsink_add_internal (GstMultiUDPSink * sink, + const gchar * host, gint port, gboolean lock); +static void gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, + gboolean lock); static void free_client (GstUDPClient * client); static GstElementClass *parent_class = NULL; @@ -266,6 +273,10 @@ g_param_spec_int ("sock", "Socket Handle", "Socket currently in use for UDP sending. (-1 == no socket)", -1, G_MAXINT, DEFAULT_SOCK, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_CLIENTS, + g_param_spec_string ("clients", "Clients", + "A comma separated list of host:port pairs with destinations", + DEFAULT_CLIENTS, G_PARAM_READWRITE)); gstelement_class->change_state = gst_multiudpsink_change_state; @@ -370,6 +381,61 @@ } static void +gst_multiudpsink_set_clients_string (GstMultiUDPSink * sink, + const gchar * string) +{ + gchar **clients; + gint i; + clients = g_strsplit (string, ",", 0); + g_mutex_lock (sink->client_lock); + /* clear all existing clients */ + gst_multiudpsink_clear_internal (sink, FALSE); + for (i = 0; clients[i]; i++) { + gchar *host, *p; + gint port = 0; + host = clients[i]; + p = strstr (clients[i], ":"); + if (p != NULL) { + *p = '\0'; + port = atoi (p + 1); + } + if (port != 0) + gst_multiudpsink_add_internal (sink, host, port, FALSE); + } + g_mutex_unlock (sink->client_lock); + g_strfreev (clients); +} +static gchar * +gst_multiudpsink_get_clients_string (GstMultiUDPSink * sink) + GString *str; + GList *clients; + str = g_string_new (""); + clients = sink->clients; + while (clients) { + GstUDPClient *client; + client = (GstUDPClient *) clients->data; + clients = g_list_next (clients); + g_string_append_printf (str, "%s:%d%s", client->host, client->port, + (clients ? "," : "")); + return g_string_free (str, FALSE); +static void gst_multiudpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -385,6 +451,9 @@ case PROP_CLOSEFD: udpsink->closefd = g_value_get_boolean (value); break; + case PROP_CLIENTS: + gst_multiudpsink_set_clients_string (udpsink, g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -415,6 +484,10 @@ case PROP_SOCK: g_value_set_int (value, udpsink->sock); + g_value_take_string (value, + gst_multiudpsink_get_clients_string (udpsink)); @@ -512,8 +585,9 @@ CLOSE_IF_REQUESTED (sink); -void -gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port) +gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, + gint port, gboolean lock) struct hostent *he; struct in_addr addr; @@ -563,9 +637,11 @@ goto host_error; } - g_mutex_lock (sink->client_lock); + if (lock) + g_mutex_lock (sink->client_lock); sink->clients = g_list_prepend (sink->clients, client); - g_mutex_unlock (sink->client_lock); + g_mutex_unlock (sink->client_lock); g_signal_emit (G_OBJECT (sink), gst_multiudpsink_signals[SIGNAL_CLIENT_ADDED], 0, host, port); @@ -582,6 +658,12 @@ +void +gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port) + gst_multiudpsink_add_internal (sink, host, port, TRUE); static gint client_compare (GstUDPClient * a, GstUDPClient * b) @@ -648,17 +730,25 @@ -gst_multiudpsink_clear (GstMultiUDPSink * sink) +gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, gboolean lock) GST_DEBUG_OBJECT (sink, "clearing"); /* we only need to remove the client structure, there is no additional * socket or anything to free for UDP */ g_list_foreach (sink->clients, (GFunc) free_client, sink); g_list_free (sink->clients); sink->clients = NULL; +gst_multiudpsink_clear (GstMultiUDPSink * sink) + gst_multiudpsink_clear_internal (sink, TRUE); GValueArray * |
From: <wt...@ke...> - 2007-09-10 19:53:40
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Sep 10 2007 19:53:42 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create): Make udpsrc timestamp outgoing buffers based on when they were received. Also make it output a segment in time. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3084&r2=1.3085 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.76&r2=1.77 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3084 retrieving revision 1.3085 diff -u -d -r1.3084 -r1.3085 --- ChangeLog 10 Sep 2007 06:49:31 -0000 1.3084 +++ ChangeLog 10 Sep 2007 19:53:27 -0000 1.3085 @@ -1,3 +1,9 @@ +2007-09-10 Wim Taymans <wim...@gm...> + + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create): + Make udpsrc timestamp outgoing buffers based on when they were received. + Also make it output a segment in time. 2007-09-10 Stefan Kost <en...@us...> * gst/avi/gstavidemux.c: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.76 retrieving revision 1.77 diff -u -d -r1.76 -r1.77 --- gstudpsrc.c 17 Aug 2007 13:59:15 -0000 1.76 +++ gstudpsrc.c 10 Sep 2007 19:53:28 -0000 1.77 @@ -322,6 +322,8 @@ udpsrc->sock = UDP_DEFAULT_SOCK; udpsrc->control_sock[0] = -1; udpsrc->control_sock[1] = -1; + gst_base_src_set_format (GST_BASE_SRC (udpsrc), GST_FORMAT_TIME); + gst_base_src_set_do_timestamp (GST_BASE_SRC (udpsrc), TRUE); } static void |
From: <wt...@ke...> - 2007-09-26 14:28:31
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Sep 26 2007 14:28:35 UTC Log message: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Update documentation. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3118&r2=1.3119 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.77&r2=1.78 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3118 retrieving revision 1.3119 diff -u -d -r1.3118 -r1.3119 --- ChangeLog 26 Sep 2007 14:26:32 -0000 1.3118 +++ ChangeLog 26 Sep 2007 14:28:19 -0000 1.3119 @@ -1,5 +1,10 @@ 2007-09-26 Wim Taymans <wim...@gm...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Update documentation. + +2007-09-26 Wim Taymans <wim...@gm...> * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), (gst_rtp_xqt_depay_change_state): * gst/qtdemux/gstrtpxqtdepay.h: Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.77 retrieving revision 1.78 diff -u -d -r1.77 -r1.78 --- gstudpsrc.c 10 Sep 2007 19:53:28 -0000 1.77 +++ gstudpsrc.c 26 Sep 2007 14:28:20 -0000 1.78 @@ -78,7 +78,8 @@ * <para> * The udpsrc is always a live source. It does however not provide a GstClock, this * is left for upstream elements such as an RTP session manager or demuxer (such - * as an MPEG demuxer). + * as an MPEG demuxer). As with all live sources, the captured buffers will have + * their timestamp set to the current running time of the pipeline. * </para> * udpsrc implements a GstURIHandler interface that handles udp://host:port type @@ -87,7 +88,7 @@ * If the <link linkend="GstUDPSrc--timeout">timeout property</link> is set to a * value bigger than 0, udpsrc will generate an element message named - * <classname>"GstUDPSrcTimeout"</classname>: + * <classname>"GstUDPSrcTimeout"</classname> * if no data was recieved in the given timeout. * The message's structure contains one field: * <itemizedlist> @@ -110,7 +111,7 @@ * in which case the application is responsible for closing the file descriptor. - * Last reviewed on 2007-03-29 (0.10.6) + * Last reviewed on 2007-09-20 (0.10.7) * </refsect2> */ |
From: <wt...@ke...> - 2007-10-18 17:04:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Oct 18 2007 17:04:28 UTC Log message: Based on patch by: Laurent Glayal <spglegle yahoo fr> * gst/udp/gstudpsrc.c: (gst_udpsrc_create): When the socket is used by the app for other purposes, don't generate an error if there is activaty on the socket that is not data related. Fixes #487488. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3143&r2=1.3144 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.78&r2=1.79 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3143 retrieving revision 1.3144 diff -u -d -r1.3143 -r1.3144 --- ChangeLog 18 Oct 2007 14:55:36 -0000 1.3143 +++ ChangeLog 18 Oct 2007 17:04:13 -0000 1.3144 @@ -1,5 +1,14 @@ 2007-10-18 Wim Taymans <wim...@gm...> + Based on patch by: Laurent Glayal <spglegle yahoo fr> + + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + When the socket is used by the app for other purposes, don't generate an + error if there is activaty on the socket that is not data related. + Fixes #487488. +2007-10-18 Wim Taymans <wim...@gm...> * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2src_grab_frame): Add some more debug info. Generate an error when we run out of buffers Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.78 retrieving revision 1.79 diff -u -d -r1.78 -r1.79 --- gstudpsrc.c 26 Sep 2007 14:28:20 -0000 1.78 +++ gstudpsrc.c 18 Oct 2007 17:04:14 -0000 1.79 @@ -377,6 +377,7 @@ udpsrc = GST_UDPSRC (psrc); +retry: /* quick check, avoid going in select when we already have data */ readsize = 0; if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) @@ -450,8 +451,12 @@ goto ioctl_failed; + /* if we get here and there is nothing to read from the socket, the select got + * woken up by activity on the socket but it was not a read. We how someone + * will also do something with the socket so that we don't go into an infinite + * loop in the select(). */ if (!readsize) - goto nothing_to_read; + goto retry; no_select: GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); @@ -514,13 +519,6 @@ ("ioctl failed %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } -nothing_to_read: - { - GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), - ("ioctl returned readsize 0 %d: %s (%d)", ret, g_strerror (errno), - errno)); - return GST_FLOW_ERROR; - } receive_error: { g_free (pktdata); |
From: <wt...@ke...> - 2008-01-17 11:13:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jan 17 2008 11:13:30 UTC Log message: Patch by: Olivier Crete <tester at tester dot ca> * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), (gst_multiudpsink_remove): * gst/udp/gstmultiudpsink.h: Add property to automatically join a multicast group or not. This can be useful when sharing a socket between multiple elements. Fixes #509531. Modified files: . : ChangeLog gst/udp : gstmultiudpsink.c gstmultiudpsink.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3259&r2=1.3260 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.h.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3259 retrieving revision 1.3260 diff -u -d -r1.3259 -r1.3260 --- ChangeLog 16 Jan 2008 21:53:40 -0000 1.3259 +++ ChangeLog 17 Jan 2008 11:13:15 -0000 1.3260 @@ -1,3 +1,16 @@ +2008-01-17 Wim Taymans <wim...@co...> + + Patch by: Olivier Crete <tester at tester dot ca> + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_set_property), + (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), + (gst_multiudpsink_add_internal), (gst_multiudpsink_remove): + * gst/udp/gstmultiudpsink.h: + Add property to automatically join a multicast group or not. This can be + useful when sharing a socket between multiple elements. + Fixes #509531. 2008-01-16 Stefan Kost <en...@us...> * gst/videomixer/Makefile.am: Index: gstmultiudpsink.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstmultiudpsink.c 2 Nov 2007 21:16:08 -0000 1.24 +++ gstmultiudpsink.c 17 Jan 2008 11:13:16 -0000 1.25 @@ -80,6 +80,7 @@ #define DEFAULT_CLOSEFD TRUE #define DEFAULT_SOCK -1 #define DEFAULT_CLIENTS NULL +#define DEFAULT_AUTO_MULTICAST TRUE enum { @@ -89,7 +90,8 @@ PROP_SOCKFD, PROP_CLOSEFD, PROP_SOCK, - PROP_CLIENTS + PROP_CLIENTS, + PROP_AUTO_MULTICAST /* FILL ME */ }; @@ -285,6 +287,11 @@ g_param_spec_string ("clients", "Clients", "A comma separated list of host:port pairs with destinations", DEFAULT_CLIENTS, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_AUTO_MULTICAST, + g_param_spec_boolean ("auto-multicast", + "Automatically join/leave multicast groups", + "Automatically join/leave the multicast groups, FALSE means user" + " has to do it himself", DEFAULT_AUTO_MULTICAST, G_PARAM_READWRITE)); gstelement_class->change_state = gst_multiudpsink_change_state; @@ -308,6 +315,7 @@ sink->sockfd = DEFAULT_SOCKFD; sink->closefd = DEFAULT_CLOSEFD; sink->externalfd = (sink->sockfd != -1); + sink->auto_multicast = DEFAULT_AUTO_MULTICAST; } static void @@ -462,6 +470,9 @@ case PROP_CLIENTS: gst_multiudpsink_set_clients_string (udpsink, g_value_get_string (value)); break; + case PROP_AUTO_MULTICAST: + udpsink->auto_multicast = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -496,6 +507,9 @@ g_value_take_string (value, gst_multiudpsink_get_clients_string (udpsink)); + g_value_set_boolean (value, udpsink->auto_multicast); @@ -565,7 +579,7 @@ for (clients = sink->clients; clients; clients = g_list_next (clients)) { client = (GstUDPClient *) clients->data; - if (client->multi_addr.imr_multiaddr.s_addr) + if (client->multi_addr.imr_multiaddr.s_addr && sink->auto_multicast) join_multicast (client); } return TRUE; @@ -631,7 +645,8 @@ client->theiraddr.sin_addr = *((struct in_addr *) &addr); } /* if init_send has already been called, set sockopts for multicast */ - if (*client->sock > 0 && client->multi_addr.imr_multiaddr.s_addr) + if (*client->sock > 0 && client->multi_addr.imr_multiaddr.s_addr && + sink->auto_multicast) /* we dont need to lookup for localhost */ @@ -712,7 +727,7 @@ g_get_current_time (&now); client->disconnect_time = GST_TIMEVAL_TO_TIME (now); - if (client->multi_addr.imr_multiaddr.s_addr) + if (client->multi_addr.imr_multiaddr.s_addr && sink->auto_multicast) leave_multicast (client); /* Unlock to emit signal before we delete the actual client */ Index: gstmultiudpsink.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstmultiudpsink.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstmultiudpsink.h 2 Nov 2007 21:16:08 -0000 1.9 +++ gstmultiudpsink.h 17 Jan 2008 11:13:16 -0000 1.10 @@ -70,6 +70,8 @@ gboolean closefd; gboolean externalfd; + gboolean auto_multicast; struct _GstMultiUDPSinkClass { |
From: <wt...@ke...> - 2008-02-28 11:51:32
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Feb 28 2008 11:51:39 UTC Log message: Patch by: Peter Kjellerstedt <pkj at axis com> * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Port to GstPoll. See #505417. Modified files: . : ChangeLog gst/udp : gstudpsrc.c gstudpsrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3335&r2=1.3336 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.80&r2=1.81 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h.diff?r1=1.22&r2=1.23 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3335 retrieving revision 1.3336 diff -u -d -r1.3335 -r1.3336 --- ChangeLog 28 Feb 2008 08:37:43 -0000 1.3335 +++ ChangeLog 28 Feb 2008 11:51:23 -0000 1.3336 @@ -1,3 +1,13 @@ +2008-02-28 Wim Taymans <wim...@co...> + + Patch by: Peter Kjellerstedt <pkj at axis com> + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), + (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_unlock), + (gst_udpsrc_unlock_stop), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Port to GstPoll. See #505417. 2008-02-28 Sebastian Dröge <sl...@ci...> * gst/law/mulaw-decode.c: (gst_mulawdec_chain): Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstudpsrc.c 2 Nov 2007 21:16:09 -0000 1.80 +++ gstudpsrc.c 28 Feb 2008 11:51:24 -0000 1.81 @@ -141,29 +141,12 @@ GST_DEBUG_CATEGORY_STATIC (udpsrc_debug); #define GST_CAT_DEFAULT (udpsrc_debug) -/* the select call is also performed on the control sockets, that way - * we can send special commands to unblock or restart the select call */ -#define CONTROL_RESTART 'R' /* restart the select call */ -#define CONTROL_STOP 'S' /* stop the select call */ -#define CONTROL_SOCKETS(src) src->control_sock -#define WRITE_SOCKET(src) src->control_sock[1] -#define READ_SOCKET(src) src->control_sock[0] - -#define SEND_COMMAND(src, command, res) \ -G_STMT_START { \ - unsigned char c; c = command; \ - res = write (WRITE_SOCKET(src), &c, 1); \ -} G_STMT_END -#define READ_COMMAND(src, command, res) \ -G_STMT_START { \ - res = read(READ_SOCKET(src), &command, 1); \ #define CLOSE_IF_REQUESTED(udpctx) \ +G_STMT_START { \ if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \ - CLOSE_SOCKET(udpctx->sock); \ - udpctx->sock = -1; + CLOSE_SOCKET(udpctx->sock.fd); \ + udpctx->sock.fd = -1; \ +} G_STMT_END static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -326,9 +309,7 @@ udpsrc->closefd = UDP_DEFAULT_CLOSEFD; udpsrc->externalfd = (udpsrc->sockfd != -1); - udpsrc->sock = UDP_DEFAULT_SOCK; - udpsrc->control_sock[0] = -1; - udpsrc->control_sock[1] = -1; + udpsrc->sock.fd = UDP_DEFAULT_SOCK; gst_base_src_set_format (GST_BASE_SRC (udpsrc), GST_FORMAT_TIME); gst_base_src_set_do_timestamp (GST_BASE_SRC (udpsrc), TRUE); } @@ -368,8 +349,6 @@ GstNetBuffer *outbuf; struct sockaddr_in tmpaddr; socklen_t len; - fd_set read_fds; - guint max_sock; guint8 *pktdata; gint pktsize; @@ -378,6 +357,7 @@ #elif defined G_OS_WIN32 gulong readsize; #endif + GstClockTime timeout; gint ret; gboolean try_again; @@ -386,49 +366,29 @@ retry: /* quick check, avoid going in select when we already have data */ readsize = 0; - if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0) + if ((ret = IOCTL_SOCKET (udpsrc->sock.fd, FIONREAD, &readsize)) < 0) goto ioctl_failed; if (readsize > 0) goto no_select; - do { - gboolean stop; - struct timeval timeval, *timeout; - FD_ZERO (&read_fds); - FD_SET (udpsrc->sock, &read_fds); -#ifndef G_OS_WIN32 - FD_SET (READ_SOCKET (udpsrc), &read_fds); -#endif - max_sock = MAX (udpsrc->sock, READ_SOCKET (udpsrc)); + if (udpsrc->timeout > 0) { + timeout = udpsrc->timeout * GST_USECOND; + } else { + timeout = GST_CLOCK_TIME_NONE; + } + do { try_again = FALSE; - stop = FALSE; GST_LOG_OBJECT (udpsrc, "doing select, timeout %" G_GUINT64_FORMAT, udpsrc->timeout); - if (udpsrc->timeout > 0) { - timeval.tv_sec = udpsrc->timeout / 1000000; - timeval.tv_usec = udpsrc->timeout % 1000000; - timeout = &timeval; - } else { - timeout = NULL; - } -#ifdef G_OS_WIN32 - if (((max_sock + 1) != READ_SOCKET (udpsrc)) || - ((max_sock + 1) != WRITE_SOCKET (udpsrc))) { - ret = select (max_sock + 1, &read_fds, NULL, NULL, timeout); - ret = 1; -#else - ret = select (max_sock + 1, &read_fds, NULL, NULL, timeout); + ret = gst_poll_wait (udpsrc->fdset, timeout); GST_LOG_OBJECT (udpsrc, "select returned %d", ret); if (ret < 0) { + if (errno == EBUSY) + goto stopped; #ifdef G_OS_WIN32 if (WSAGetLastError () != WSAEINTR) goto select_error; @@ -444,9 +404,6 @@ gst_structure_new ("GstUDPSrcTimeout", "timeout", G_TYPE_UINT64, udpsrc->timeout, NULL))); try_again = TRUE; - if (FD_ISSET (READ_SOCKET (udpsrc), &read_fds)) - goto stopped; } } while (try_again); @@ -454,7 +411,7 @@ * one UDP packet. We will check the return value, though, because in some * case it can return 0 and we don't want a 0 sized buffer. */ /* if we get here and there is nothing to read from the socket, the select got @@ -472,7 +429,7 @@ while (TRUE) { len = sizeof (struct sockaddr); - ret = recvfrom (udpsrc->sock, pktdata, pktsize, + ret = recvfrom (udpsrc->sock.fd, pktdata, pktsize, 0, (struct sockaddr *) &tmpaddr, &len); if (errno != EAGAIN && errno != EINTR) @@ -690,7 +647,7 @@ g_value_set_boolean (value, udpsrc->closefd); break; case PROP_SOCK: - g_value_set_int (value, udpsrc->sock); + g_value_set_int (value, udpsrc->sock.fd); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -713,22 +670,6 @@ src = GST_UDPSRC (bsrc); - GST_DEBUG_OBJECT (src, "creating pipe"); - /* This should work on UNIX too. PF_UNIX sockets replaced with pipe */ - /* pipe( CONTROL_SOCKETS(src), 4096, _O_BINARY ) */ - if ((ret = _pipe (CONTROL_SOCKETS (src), 4096, _O_BINARY)) < 0) - goto no_socket_pair; - GST_DEBUG_OBJECT (src, "creating socket pair"); - if ((ret = socketpair (PF_UNIX, SOCK_STREAM, 0, CONTROL_SOCKETS (src))) < 0) - fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK); - fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); if (!inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) src->multi_addr.imr_multiaddr.s_addr = 0; @@ -737,12 +678,12 @@ if ((ret = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) goto no_socket; - src->sock = ret; + src->sock.fd = ret; src->externalfd = FALSE; reuse = 1; if ((ret = - setsockopt (src->sock, SOL_SOCKET, SO_REUSEADDR, &reuse, + setsockopt (src->sock.fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof (reuse))) < 0) goto setsockopt_error; @@ -756,25 +697,26 @@ src->myaddr.sin_addr.s_addr = INADDR_ANY; GST_DEBUG_OBJECT (src, "binding on port %d", src->port); - if ((ret = bind (src->sock, (struct sockaddr *) &src->myaddr, + if ((ret = bind (src->sock.fd, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr))) < 0) goto bind_error; } else { /* we use the configured socket */ - src->sock = src->sockfd; + src->sock.fd = src->sockfd; src->externalfd = TRUE; } if (src->multi_addr.imr_multiaddr.s_addr) { src->multi_addr.imr_interface.s_addr = INADDR_ANY; - setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, + setsockopt (src->sock.fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr, sizeof (src->multi_addr))) < 0) goto membership; len = sizeof (my_addr); - if ((ret = getsockname (src->sock, (struct sockaddr *) &my_addr, &len)) < 0) + if ((ret = + getsockname (src->sock.fd, (struct sockaddr *) &my_addr, &len)) < 0) goto getsockname_error; len = sizeof (rcvsize); @@ -785,7 +727,9 @@ /* set buffer size, Note that on Linux this is typically limited to a * maximum of around 100K. Also a minimum of 128 bytes is required on * Linux. */ - ret = setsockopt (src->sock, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, len); + ret = + setsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, + len); if (ret != 0) goto udpbuffer_error; @@ -793,14 +737,15 @@ /* read the value of the receive buffer. Note that on linux this returns 2x the * value we set because the kernel allocates extra memory for metadata. * The default on Linux is about 100K (which is about 50K without metadata) */ - ret = getsockopt (src->sock, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, &len); + ret = + getsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, &len); if (ret == 0) GST_DEBUG_OBJECT (src, "have udp buffer of %d bytes", rcvsize); else GST_DEBUG_OBJECT (src, "could not get udp buffer size"); bc_val = 1; - if ((ret = setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, + if ((ret = setsockopt (src->sock.fd, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val))) < 0) goto no_broadcast; @@ -814,15 +759,20 @@ src->myaddr.sin_port = htons (src->port + 1); +#ifdef G_OS_WIN32 + if ((src->fdset = gst_poll_new (GST_POLL_MODE_AUTO, FALSE)) == NULL) + goto no_fdset; +#else + if ((src->fdset = gst_poll_new (GST_POLL_MODE_AUTO, TRUE)) == NULL) +#endif + gst_poll_add_fd (src->fdset, &src->sock); + gst_poll_fd_ctl_read (src->fdset, &src->sock, TRUE); return TRUE; /* ERRORS */ -no_socket_pair: - { - GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), - ("no socket pair %d: %s (%d)", ret, g_strerror (errno), errno)); - return FALSE; - } no_socket: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), @@ -873,19 +823,25 @@ g_strerror (errno), errno)); return FALSE; +no_fdset: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + ("could not create an fdset %d: %s (%d)", ret, g_strerror (errno), + errno)); + return FALSE; static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc) { GstUDPSrc *src; - gint res; - GST_LOG_OBJECT (src, "sending stop command"); - SEND_COMMAND (src, CONTROL_STOP, res); - GST_LOG_OBJECT (src, "sent stop command %d", res); + GST_LOG_OBJECT (src, "Flushing"); + gst_poll_set_flushing (src->fdset, TRUE); @@ -897,21 +853,8 @@ - GST_LOG_OBJECT (src, "clearing unlock command queue"); - while (TRUE) { - gchar command; - int res; - GST_LOG_OBJECT (src, "reading command"); - READ_COMMAND (src, command, res); - if (res <= 0) { - GST_LOG_OBJECT (src, "no more commands"); - /* no more commands */ - break; + GST_LOG_OBJECT (src, "No longer flushing"); + gst_poll_set_flushing (src->fdset, FALSE); @@ -925,18 +868,13 @@ GST_DEBUG ("stopping, closing sockets"); - if (src->sock != -1) { + if (src->sock.fd >= 0) { CLOSE_IF_REQUESTED (src); - /* pipes on WIN32 else sockets */ - if (src->control_sock[0] != -1) { - close (src->control_sock[0]); - src->control_sock[0] = -1; - if (src->control_sock[1] != -1) { - close (src->control_sock[1]); - src->control_sock[1] = -1; + if (src->fdset) { + gst_poll_free (src->fdset); + src->fdset = NULL; WSA_CLEANUP (src); Index: gstudpsrc.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstudpsrc.h 29 Mar 2007 09:59:23 -0000 1.22 +++ gstudpsrc.h 28 Feb 2008 11:51:24 -0000 1.23 @@ -52,21 +52,21 @@ GstPushSrc parent; /* properties */ - gchar *uri; - int port; - gchar *multi_group; - gint ttl; - GstCaps *caps; - gint buffer_size; - guint64 timeout; - gint skip_first_bytes; - int sockfd; - gboolean closefd; + gchar *uri; + int port; + gchar *multi_group; + gint ttl; + GstCaps *caps; + gint buffer_size; + guint64 timeout; + gint skip_first_bytes; + int sockfd; + gboolean closefd; /* our sockets */ - int sock; - int control_sock[2]; - gboolean externalfd; + GstPollFD sock; + GstPoll *fdset; + gboolean externalfd; struct sockaddr_in myaddr; struct ip_mreq multi_addr; |
From: <wt...@ke...> - 2008-03-07 10:01:48
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Mar 07 2008 10:01:54 UTC Log message: Patch by: Ole André Vadla Ravnås <ole...@ta...> * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_start), (gst_udpsrc_stop): Properly balance WSA_Cleanup with WSA_Startup. Also make the poll controllable on windows. Fixes #520888. Modified files: . : ChangeLog gst/udp : gstudpsrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3343&r2=1.3344 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c.diff?r1=1.81&r2=1.82 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3343 retrieving revision 1.3344 diff -u -d -r1.3343 -r1.3344 --- ChangeLog 6 Mar 2008 19:47:46 -0000 1.3343 +++ ChangeLog 7 Mar 2008 10:01:39 -0000 1.3344 @@ -1,3 +1,12 @@ +2008-03-07 Wim Taymans <wim...@co...> + + Patch by: Ole André Vadla Ravnås <ole...@ta...> + * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_start), + (gst_udpsrc_stop): + Properly balance WSA_Cleanup with WSA_Startup. + Also make the poll controllable on windows. Fixes #520888. 2008-03-06 Wim Taymans <wim...@co...> * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), Index: gstudpsrc.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/udp/gstudpsrc.c,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- gstudpsrc.c 28 Feb 2008 11:51:24 -0000 1.81 +++ gstudpsrc.c 7 Mar 2008 10:01:40 -0000 1.82 @@ -326,6 +326,8 @@ g_free (udpsrc->multi_group); g_free (udpsrc->uri); + WSA_CLEANUP (src); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -759,13 +761,8 @@ src->myaddr.sin_port = htons (src->port + 1); -#ifdef G_OS_WIN32 - if ((src->fdset = gst_poll_new (GST_POLL_MODE_AUTO, FALSE)) == NULL) - goto no_fdset; -#else if ((src->fdset = gst_poll_new (GST_POLL_MODE_AUTO, TRUE)) == NULL) goto no_fdset; -#endif gst_poll_add_fd (src->fdset, &src->sock); gst_poll_fd_ctl_read (src->fdset, &src->sock, TRUE); @@ -877,8 +874,6 @@ src->fdset = NULL; } - WSA_CLEANUP (src); - return TRUE; |