diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-03 17:49:02 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-09 14:16:12 +0200 |
commit | 0d1251159cd8dcddf5a6c18b9bb5df0a5c15cd2a (patch) | |
tree | fa8283dde28db4dc95073d7333ae450076a54d9e | |
parent | dfc722d7a499ff770ae0c6fb950b9c00b7340018 (diff) |
rtspsrc: Proxy the multicast-iface property of udpsrc
-rw-r--r-- | gst/rtsp/gstrtspsrc.c | 28 | ||||
-rw-r--r-- | gst/rtsp/gstrtspsrc.h | 1 |
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; |