dynudpsink: Port to GIO

This commit is contained in:
Sebastian Dröge 2012-01-17 09:38:33 +01:00
parent 7f0239b19b
commit 6f055d554b
3 changed files with 19 additions and 25 deletions

View file

@ -51,14 +51,12 @@ enum
#define UDP_DEFAULT_SOCKET NULL #define UDP_DEFAULT_SOCKET NULL
#define UDP_DEFAULT_CLOSE_SOCKET TRUE #define UDP_DEFAULT_CLOSE_SOCKET TRUE
#define UDP_DEFAULT_FAMILY G_SOCKET_FAMILY_IPV4
enum enum
{ {
PROP_0, PROP_0,
PROP_SOCKET, PROP_SOCKET,
PROP_CLOSE_SOCKET, PROP_CLOSE_SOCKET
PROP_FAMILY
}; };
static void gst_dynudpsink_finalize (GObject * object); static void gst_dynudpsink_finalize (GObject * object);
@ -113,12 +111,6 @@ gst_dynudpsink_class_init (GstDynUDPSinkClass * klass)
UDP_DEFAULT_CLOSE_SOCKET, UDP_DEFAULT_CLOSE_SOCKET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_FAMILY,
g_param_spec_enum ("family", "Socket family",
"Use IPv4 or IPv6",
G_TYPE_SOCKET_FAMILY, UDP_DEFAULT_FAMILY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gst_element_class_add_pad_template (gstelement_class, gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&sink_template)); gst_static_pad_template_get (&sink_template));
@ -142,10 +134,10 @@ gst_dynudpsink_init (GstDynUDPSink * sink)
sink->socket = UDP_DEFAULT_SOCKET; sink->socket = UDP_DEFAULT_SOCKET;
sink->close_socket = UDP_DEFAULT_CLOSE_SOCKET; sink->close_socket = UDP_DEFAULT_CLOSE_SOCKET;
sink->external_socket = FALSE; sink->external_socket = FALSE;
sink->family = G_SOCKET_FAMILY_IPV4;
sink->used_socket = NULL; sink->used_socket = NULL;
sink->cancellable = g_cancellable_new (); sink->cancellable = g_cancellable_new ();
sink->family = G_SOCKET_FAMILY_IPV6;
} }
static void static void
@ -180,6 +172,7 @@ gst_dynudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
GstNetAddressMeta *meta; GstNetAddressMeta *meta;
GSocketAddress *addr; GSocketAddress *addr;
GError *err = NULL; GError *err = NULL;
GSocketFamily family;
meta = gst_buffer_get_net_address_meta (buffer); meta = gst_buffer_get_net_address_meta (buffer);
@ -193,7 +186,8 @@ gst_dynudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
/* let's get the address from the metadata */ /* let's get the address from the metadata */
addr = meta->addr; addr = meta->addr;
if (g_socket_address_get_family (addr) != sink->family) family = g_socket_address_get_family (addr);
if (sink->family != family && family != G_SOCKET_FAMILY_IPV4)
goto invalid_family; goto invalid_family;
data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
@ -267,9 +261,6 @@ gst_dynudpsink_set_property (GObject * object, guint prop_id,
case PROP_CLOSE_SOCKET: case PROP_CLOSE_SOCKET:
udpsink->close_socket = g_value_get_boolean (value); udpsink->close_socket = g_value_get_boolean (value);
break; break;
case PROP_FAMILY:
udpsink->family = g_value_get_enum (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -291,9 +282,6 @@ gst_dynudpsink_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_CLOSE_SOCKET: case PROP_CLOSE_SOCKET:
g_value_set_boolean (value, udpsink->close_socket); g_value_set_boolean (value, udpsink->close_socket);
break; break;
case PROP_FAMILY:
g_value_set_enum (value, udpsink->family);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -310,19 +298,27 @@ gst_dynudpsink_start (GstBaseSink * bsink)
udpsink = GST_DYNUDPSINK (bsink); udpsink = GST_DYNUDPSINK (bsink);
if (udpsink->socket == NULL) { if (udpsink->socket == NULL) {
/* create sender socket if none available */ /* create sender socket if none available, first try IPv6, then
* fall-back to IPv4 */
udpsink->family = G_SOCKET_FAMILY_IPV6;
if ((udpsink->used_socket = if ((udpsink->used_socket =
g_socket_new (udpsink->family, g_socket_new (G_SOCKET_FAMILY_IPV6,
G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &err)) == NULL) G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &err)) == NULL) {
goto no_socket; udpsink->family = G_SOCKET_FAMILY_IPV4;
if ((udpsink->used_socket = g_socket_new (G_SOCKET_FAMILY_IPV4,
G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &err)) == NULL)
goto no_socket;
}
g_socket_set_broadcast (udpsink->used_socket, TRUE);
udpsink->external_socket = FALSE; udpsink->external_socket = FALSE;
} else { } else {
udpsink->used_socket = G_SOCKET (g_object_ref (udpsink->socket)); udpsink->used_socket = G_SOCKET (g_object_ref (udpsink->socket));
udpsink->external_socket = TRUE; udpsink->external_socket = TRUE;
udpsink->family = g_socket_get_family (udpsink->used_socket);
} }
g_socket_set_broadcast (udpsink->used_socket, TRUE);
return TRUE; return TRUE;
/* ERRORS */ /* ERRORS */

View file

@ -47,12 +47,12 @@ struct _GstDynUDPSink {
/* properties */ /* properties */
GSocket *socket; GSocket *socket;
gboolean close_socket; gboolean close_socket;
GSocketFamily family;
/* the socket in use */ /* the socket in use */
GSocket *used_socket; GSocket *used_socket;
gboolean external_socket; gboolean external_socket;
GCancellable *cancellable; GCancellable *cancellable;
GSocketFamily family;
}; };
struct _GstDynUDPSinkClass { struct _GstDynUDPSinkClass {

View file

@ -278,8 +278,6 @@ gst_udpsrc_class_init (GstUDPSrcClass * klass)
static void static void
gst_udpsrc_init (GstUDPSrc * udpsrc) gst_udpsrc_init (GstUDPSrc * udpsrc)
{ {
WSA_STARTUP (udpsrc);
udpsrc->uri = udpsrc->uri =
g_strdup_printf ("udp://%s:%u", UDP_DEFAULT_MULTICAST_GROUP, g_strdup_printf ("udp://%s:%u", UDP_DEFAULT_MULTICAST_GROUP,
UDP_DEFAULT_PORT); UDP_DEFAULT_PORT);