summaryrefslogtreecommitdiffstats
path: root/gst/udp
diff options
context:
space:
mode:
authorHenrik Eriksson <henriken@axis.com>2008-05-21 10:51:52 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-05-21 10:51:52 +0000
commit46d94158bc695821a8bf896398907aef1c6c126a (patch)
tree33fd6cb94d565c5e846400d831c7ee96d1a9ab95 /gst/udp
parent0a18ec7d8d15d8ab13483dd95bb660cc6e639e3e (diff)
gst/udp/gstmultiudpsink.*: Add qos-dscp property to manage the Quality of service.
Original commit message from CVS: Patch by: Henrik Eriksson <henriken at axis dot com> * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_setup_qos_dscp), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): * gst/udp/gstmultiudpsink.h: Add qos-dscp property to manage the Quality of service.
Diffstat (limited to 'gst/udp')
-rw-r--r--gst/udp/gstmultiudpsink.c62
-rw-r--r--gst/udp/gstmultiudpsink.h1
2 files changed, 47 insertions, 16 deletions
diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c
index 0519ba32..a4209e03 100644
--- a/gst/udp/gstmultiudpsink.c
+++ b/gst/udp/gstmultiudpsink.c
@@ -83,6 +83,7 @@ enum
#define DEFAULT_AUTO_MULTICAST TRUE
#define DEFAULT_TTL 64
#define DEFAULT_LOOP TRUE
+#define DEFAULT_QOS_DSCP 0
enum
{
@@ -95,8 +96,9 @@ enum
PROP_CLIENTS,
PROP_AUTO_MULTICAST,
PROP_TTL,
- PROP_LOOP
- /* FILL ME */
+ PROP_LOOP,
+ PROP_QOS_DSCP,
+ PROP_LAST
};
#define CLOSE_IF_REQUESTED(udpctx) \
@@ -304,6 +306,10 @@ gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass)
g_param_spec_boolean ("loop", "Multicast Loopback",
"Used for setting the multicast loop parameter. TRUE = enable,"
" FALSE = disable", DEFAULT_LOOP, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QOS_DSCP,
+ g_param_spec_uint ("qos-dscp", "QoS diff srv code point",
+ "Quality of Service, differentiated services code point", 0, 63,
+ DEFAULT_QOS_DSCP, G_PARAM_READWRITE));
gstelement_class->change_state = gst_multiudpsink_change_state;
@@ -330,6 +336,7 @@ gst_multiudpsink_init (GstMultiUDPSink * sink)
sink->auto_multicast = DEFAULT_AUTO_MULTICAST;
sink->ttl = DEFAULT_TTL;
sink->loop = DEFAULT_LOOP;
+ sink->qos_dscp = DEFAULT_QOS_DSCP;
}
static void
@@ -466,6 +473,29 @@ gst_multiudpsink_get_clients_string (GstMultiUDPSink * sink)
}
static void
+gst_multiudpsink_setup_qos_dscp (GstMultiUDPSink * sink)
+{
+ gint tos;
+
+ if (sink->sock < 0)
+ return;
+
+ GST_DEBUG_OBJECT (sink, "setting TOS to %d", sink->qos_dscp);
+
+ /* Extract and shift 6 bits of DSFIELD */
+ tos = (sink->qos_dscp & 0x3f) << 2;
+
+ if (setsockopt (sink->sock, SOL_IP, IP_TOS, &tos, sizeof (tos)) < 0) {
+ GST_ERROR_OBJECT (sink, "could not set TOS: %s", g_strerror (errno));
+ }
+#ifdef IPV6_TCLASS
+ if (setsockopt (sink->sock, SOL_IPV6, IPV6_TCLASS, &tos, sizeof (tos)) < 0) {
+ GST_ERROR_OBJECT (sink, "could not set TCLASS: %s", g_strerror (errno));
+ }
+#endif
+}
+
+static void
gst_multiudpsink_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
@@ -493,6 +523,10 @@ gst_multiudpsink_set_property (GObject * object, guint prop_id,
case PROP_LOOP:
udpsink->loop = g_value_get_boolean (value);
break;
+ case PROP_QOS_DSCP:
+ udpsink->qos_dscp = g_value_get_uint (value);
+ gst_multiudpsink_setup_qos_dscp (udpsink);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -536,22 +570,15 @@ gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_LOOP:
g_value_set_boolean (value, udpsink->loop);
break;
+ case PROP_QOS_DSCP:
+ g_value_set_int (value, udpsink->qos_dscp);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
-static void
-join_multicast (GstUDPClient * client, gboolean loop, int ttl)
-{
- /* 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. */
- gst_udp_join_group (*(client->sock), loop, ttl, &client->theiraddr);
-}
-
/* create a socket for sending to remote machine */
static gboolean
gst_multiudpsink_init_send (GstMultiUDPSink * sink)
@@ -562,7 +589,7 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
GstUDPClient *client;
if (sink->sockfd == -1) {
- /* create sender socket */
+ /* create sender socket try IP6, fall back to IP4 */
if ((sink->sock = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
goto no_socket;
@@ -583,12 +610,14 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
sink->bytes_to_serve = 0;
sink->bytes_served = 0;
- /* look for multicast clients and join multicast groups approptiately */
+ gst_multiudpsink_setup_qos_dscp (sink);
+ /* look for multicast clients and join multicast groups approptiately */
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
client = (GstUDPClient *) clients->data;
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
- join_multicast (client, sink->loop, sink->ttl);
+ gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
+ &client->theiraddr);
}
return TRUE;
@@ -638,7 +667,8 @@ gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host,
if (*client->sock > 0 && gst_udp_is_multicast (&client->theiraddr) &&
sink->auto_multicast) {
GST_DEBUG_OBJECT (sink, "multicast address detected");
- join_multicast (client, sink->loop, sink->ttl);
+ gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
+ &client->theiraddr);
} else {
GST_DEBUG_OBJECT (sink, "normal address detected");
}
diff --git a/gst/udp/gstmultiudpsink.h b/gst/udp/gstmultiudpsink.h
index 21c2a96c..e2bd2aa9 100644
--- a/gst/udp/gstmultiudpsink.h
+++ b/gst/udp/gstmultiudpsink.h
@@ -73,6 +73,7 @@ struct _GstMultiUDPSink {
gboolean auto_multicast;
gint ttl;
gboolean loop;
+ guint qos_dscp;
};
struct _GstMultiUDPSinkClass {