summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2013-04-03 17:49:02 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2013-04-09 14:16:12 +0200
commit0d1251159cd8dcddf5a6c18b9bb5df0a5c15cd2a (patch)
treefa8283dde28db4dc95073d7333ae450076a54d9e
parentdfc722d7a499ff770ae0c6fb950b9c00b7340018 (diff)
rtspsrc: Proxy the multicast-iface property of udpsrc
-rw-r--r--gst/rtsp/gstrtspsrc.c28
-rw-r--r--gst/rtsp/gstrtspsrc.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index b6e313c8e..d6e954da4 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -188,6 +188,7 @@ gst_rtsp_src_buffer_mode_get_type (void)
#define DEFAULT_PORT_RANGE NULL
#define DEFAULT_SHORT_HEADER FALSE
#define DEFAULT_PROBATION 2
+#define DEFAULT_MULTICAST_IFACE NULL
enum
{
@@ -213,6 +214,7 @@ enum
PROP_UDP_BUFFER_SIZE,
PROP_SHORT_HEADER,
PROP_PROBATION,
+ PROP_MULTICAST_IFACE,
PROP_LAST
};
@@ -528,6 +530,11 @@ gst_rtspsrc_class_init (GstRTSPSrcClass * klass)
0, G_MAXUINT, DEFAULT_PROBATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE,
+ g_param_spec_string ("multicast-iface", "Multicast Interface",
+ "The network interface on which to join the multicast group",
+ DEFAULT_MULTICAST_IFACE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gstelement_class->send_event = gst_rtspsrc_send_event;
gstelement_class->change_state = gst_rtspsrc_change_state;
@@ -570,6 +577,7 @@ gst_rtspsrc_init (GstRTSPSrc * src, GstRTSPSrcClass * g_class)
src->udp_buffer_size = DEFAULT_UDP_BUFFER_SIZE;
src->short_header = DEFAULT_SHORT_HEADER;
src->probation = DEFAULT_PROBATION;
+ src->multi_iface = g_strdup (DEFAULT_MULTICAST_IFACE);
/* get a list of all extensions */
src->extensions = gst_rtsp_ext_list_get ();
@@ -605,6 +613,7 @@ gst_rtspsrc_finalize (GObject * object)
g_free (rtspsrc->conninfo.url_str);
g_free (rtspsrc->user_id);
g_free (rtspsrc->user_pw);
+ g_free (rtspsrc->multi_iface);
if (rtspsrc->sdp) {
gst_sdp_message_free (rtspsrc->sdp);
@@ -775,6 +784,14 @@ gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value,
case PROP_PROBATION:
rtspsrc->probation = g_value_get_uint (value);
break;
+ case PROP_MULTICAST_IFACE:
+ g_free (rtspsrc->multi_iface);
+
+ if (g_value_get_string (value) == NULL)
+ rtspsrc->multi_iface = g_strdup (DEFAULT_MULTICAST_IFACE);
+ else
+ rtspsrc->multi_iface = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -879,6 +896,9 @@ gst_rtspsrc_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_PROBATION:
g_value_set_uint (value, rtspsrc->probation);
break;
+ case PROP_MULTICAST_IFACE:
+ g_value_set_string (value, rtspsrc->multi_iface);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2825,6 +2845,10 @@ gst_rtspsrc_stream_configure_mcast (GstRTSPSrc * src, GstRTSPStream * stream,
g_object_set (G_OBJECT (stream->udpsrc[0]), "buffer-size",
src->udp_buffer_size, NULL);
+ if (src->multi_iface != NULL)
+ g_object_set (G_OBJECT (stream->udpsrc[0]), "multicast-iface",
+ src->multi_iface, NULL);
+
/* change state */
gst_element_set_state (stream->udpsrc[0], GST_STATE_PAUSED);
}
@@ -2841,6 +2865,10 @@ gst_rtspsrc_stream_configure_mcast (GstRTSPSrc * src, GstRTSPStream * stream,
gst_object_ref (stream->udpsrc[1]);
gst_object_sink (stream->udpsrc[1]);
+ if (src->multi_iface != NULL)
+ g_object_set (G_OBJECT (stream->udpsrc[0]), "multicast-iface",
+ src->multi_iface, NULL);
+
gst_element_set_state (stream->udpsrc[1], GST_STATE_PAUSED);
}
return TRUE;
diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h
index ba7d0450b..5164c1d9e 100644
--- a/gst/rtsp/gstrtspsrc.h
+++ b/gst/rtsp/gstrtspsrc.h
@@ -218,6 +218,7 @@ struct _GstRTSPSrc {
gint udp_buffer_size;
gboolean short_header;
guint probation;
+ gchar *multi_iface;
/* state */
GstRTSPState state;