mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-25 07:26:29 +00:00
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.
This commit is contained in:
parent
0a18ec7d8d
commit
46d94158bc
3 changed files with 58 additions and 16 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2008-05-21 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2008-05-21 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-05-21 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_process):
|
* gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_process):
|
||||||
|
|
|
@ -83,6 +83,7 @@ enum
|
||||||
#define DEFAULT_AUTO_MULTICAST TRUE
|
#define DEFAULT_AUTO_MULTICAST TRUE
|
||||||
#define DEFAULT_TTL 64
|
#define DEFAULT_TTL 64
|
||||||
#define DEFAULT_LOOP TRUE
|
#define DEFAULT_LOOP TRUE
|
||||||
|
#define DEFAULT_QOS_DSCP 0
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -95,8 +96,9 @@ enum
|
||||||
PROP_CLIENTS,
|
PROP_CLIENTS,
|
||||||
PROP_AUTO_MULTICAST,
|
PROP_AUTO_MULTICAST,
|
||||||
PROP_TTL,
|
PROP_TTL,
|
||||||
PROP_LOOP
|
PROP_LOOP,
|
||||||
/* FILL ME */
|
PROP_QOS_DSCP,
|
||||||
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||||
|
@ -304,6 +306,10 @@ gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass)
|
||||||
g_param_spec_boolean ("loop", "Multicast Loopback",
|
g_param_spec_boolean ("loop", "Multicast Loopback",
|
||||||
"Used for setting the multicast loop parameter. TRUE = enable,"
|
"Used for setting the multicast loop parameter. TRUE = enable,"
|
||||||
" FALSE = disable", DEFAULT_LOOP, G_PARAM_READWRITE));
|
" 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;
|
gstelement_class->change_state = gst_multiudpsink_change_state;
|
||||||
|
|
||||||
|
@ -330,6 +336,7 @@ gst_multiudpsink_init (GstMultiUDPSink * sink)
|
||||||
sink->auto_multicast = DEFAULT_AUTO_MULTICAST;
|
sink->auto_multicast = DEFAULT_AUTO_MULTICAST;
|
||||||
sink->ttl = DEFAULT_TTL;
|
sink->ttl = DEFAULT_TTL;
|
||||||
sink->loop = DEFAULT_LOOP;
|
sink->loop = DEFAULT_LOOP;
|
||||||
|
sink->qos_dscp = DEFAULT_QOS_DSCP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -465,6 +472,29 @@ gst_multiudpsink_get_clients_string (GstMultiUDPSink * sink)
|
||||||
return g_string_free (str, FALSE);
|
return g_string_free (str, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
gst_multiudpsink_set_property (GObject * object, guint prop_id,
|
gst_multiudpsink_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
|
@ -493,6 +523,10 @@ gst_multiudpsink_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_LOOP:
|
case PROP_LOOP:
|
||||||
udpsink->loop = g_value_get_boolean (value);
|
udpsink->loop = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_QOS_DSCP:
|
||||||
|
udpsink->qos_dscp = g_value_get_uint (value);
|
||||||
|
gst_multiudpsink_setup_qos_dscp (udpsink);
|
||||||
|
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;
|
||||||
|
@ -536,22 +570,15 @@ gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case PROP_LOOP:
|
case PROP_LOOP:
|
||||||
g_value_set_boolean (value, udpsink->loop);
|
g_value_set_boolean (value, udpsink->loop);
|
||||||
break;
|
break;
|
||||||
|
case PROP_QOS_DSCP:
|
||||||
|
g_value_set_int (value, udpsink->qos_dscp);
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 */
|
/* create a socket for sending to remote machine */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_multiudpsink_init_send (GstMultiUDPSink * sink)
|
gst_multiudpsink_init_send (GstMultiUDPSink * sink)
|
||||||
|
@ -562,7 +589,7 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
|
||||||
GstUDPClient *client;
|
GstUDPClient *client;
|
||||||
|
|
||||||
if (sink->sockfd == -1) {
|
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_INET6, SOCK_DGRAM, 0)) == -1)
|
||||||
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
|
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
|
||||||
goto no_socket;
|
goto no_socket;
|
||||||
|
@ -583,12 +610,14 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
|
||||||
sink->bytes_to_serve = 0;
|
sink->bytes_to_serve = 0;
|
||||||
sink->bytes_served = 0;
|
sink->bytes_served = 0;
|
||||||
|
|
||||||
/* 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)) {
|
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
|
||||||
client = (GstUDPClient *) clients->data;
|
client = (GstUDPClient *) clients->data;
|
||||||
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
|
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
|
||||||
join_multicast (client, sink->loop, sink->ttl);
|
gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
|
||||||
|
&client->theiraddr);
|
||||||
}
|
}
|
||||||
return TRUE;
|
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) &&
|
if (*client->sock > 0 && gst_udp_is_multicast (&client->theiraddr) &&
|
||||||
sink->auto_multicast) {
|
sink->auto_multicast) {
|
||||||
GST_DEBUG_OBJECT (sink, "multicast address detected");
|
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 {
|
} else {
|
||||||
GST_DEBUG_OBJECT (sink, "normal address detected");
|
GST_DEBUG_OBJECT (sink, "normal address detected");
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct _GstMultiUDPSink {
|
||||||
gboolean auto_multicast;
|
gboolean auto_multicast;
|
||||||
gint ttl;
|
gint ttl;
|
||||||
gboolean loop;
|
gboolean loop;
|
||||||
|
guint qos_dscp;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMultiUDPSinkClass {
|
struct _GstMultiUDPSinkClass {
|
||||||
|
|
Loading…
Reference in a new issue