From ae1fe21436cf77da079beb4580f5027ec71e2238 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 7 Jan 2014 12:21:09 +0100 Subject: [PATCH] stream: add property to configure profiles --- gst/rtsp-server/rtsp-media.c | 68 +++++++++++++++++++++++++++++++++++ gst/rtsp-server/rtsp-media.h | 3 ++ gst/rtsp-server/rtsp-stream.c | 63 +++++++++++++++++++++++++++++++- gst/rtsp-server/rtsp-stream.h | 3 ++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 4c361b93a1..734edec4b8 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -82,6 +82,7 @@ struct _GstRTSPMediaPrivate gboolean shared; gboolean suspend_mode; gboolean reusable; + GstRTSPProfile profiles; GstRTSPLowerTrans protocols; gboolean reused; gboolean eos_shutdown; @@ -125,6 +126,7 @@ struct _GstRTSPMediaPrivate #define DEFAULT_SHARED FALSE #define DEFAULT_SUSPEND_MODE GST_RTSP_SUSPEND_MODE_NONE #define DEFAULT_REUSABLE FALSE +#define DEFAULT_PROFILES GST_RTSP_PROFILE_AVP #define DEFAULT_PROTOCOLS GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST | \ GST_RTSP_LOWER_TRANS_TCP #define DEFAULT_EOS_SHUTDOWN FALSE @@ -140,6 +142,7 @@ enum PROP_SHARED, PROP_SUSPEND_MODE, PROP_REUSABLE, + PROP_PROFILES, PROP_PROTOCOLS, PROP_EOS_SHUTDOWN, PROP_BUFFER_SIZE, @@ -237,6 +240,11 @@ gst_rtsp_media_class_init (GstRTSPMediaClass * klass) "If this media pipeline can be reused after an unprepare", DEFAULT_REUSABLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROFILES, + g_param_spec_flags ("profiles", "Profiles", + "Allowed transfer profiles", GST_TYPE_RTSP_PROFILE, + DEFAULT_PROFILES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROTOCOLS, g_param_spec_flags ("protocols", "Protocols", "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS, @@ -314,6 +322,7 @@ gst_rtsp_media_init (GstRTSPMedia * media) priv->shared = DEFAULT_SHARED; priv->suspend_mode = DEFAULT_SUSPEND_MODE; priv->reusable = DEFAULT_REUSABLE; + priv->profiles = DEFAULT_PROFILES; priv->protocols = DEFAULT_PROTOCOLS; priv->eos_shutdown = DEFAULT_EOS_SHUTDOWN; priv->buffer_size = DEFAULT_BUFFER_SIZE; @@ -371,6 +380,9 @@ gst_rtsp_media_get_property (GObject * object, guint propid, case PROP_REUSABLE: g_value_set_boolean (value, gst_rtsp_media_is_reusable (media)); break; + case PROP_PROFILES: + g_value_set_flags (value, gst_rtsp_media_get_profiles (media)); + break; case PROP_PROTOCOLS: g_value_set_flags (value, gst_rtsp_media_get_protocols (media)); break; @@ -408,6 +420,9 @@ gst_rtsp_media_set_property (GObject * object, guint propid, case PROP_REUSABLE: gst_rtsp_media_set_reusable (media, g_value_get_boolean (value)); break; + case PROP_PROFILES: + gst_rtsp_media_set_profiles (media, g_value_get_flags (value)); + break; case PROP_PROTOCOLS: gst_rtsp_media_set_protocols (media, g_value_get_flags (value)); break; @@ -814,6 +829,59 @@ gst_rtsp_media_is_reusable (GstRTSPMedia * media) return res; } +static void +do_set_profiles (GstRTSPStream * stream, GstRTSPProfile * profiles) +{ + gst_rtsp_stream_set_profiles (stream, *profiles); +} + +/** + * gst_rtsp_media_set_profiles: + * @media: a #GstRTSPMedia + * @profiles: the new flags + * + * Configure the allowed lower transport for @media. + */ +void +gst_rtsp_media_set_profiles (GstRTSPMedia * media, GstRTSPProfile profiles) +{ + GstRTSPMediaPrivate *priv; + + g_return_if_fail (GST_IS_RTSP_MEDIA (media)); + + priv = media->priv; + + g_mutex_lock (&priv->lock); + priv->profiles = profiles; + g_ptr_array_foreach (priv->streams, (GFunc) do_set_profiles, &profiles); + g_mutex_unlock (&priv->lock); +} + +/** + * gst_rtsp_media_get_profiles: + * @media: a #GstRTSPMedia + * + * Get the allowed profiles of @media. + * + * Returns: a #GstRTSPProfile + */ +GstRTSPProfile +gst_rtsp_media_get_profiles (GstRTSPMedia * media) +{ + GstRTSPMediaPrivate *priv; + GstRTSPProfile res; + + g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), GST_RTSP_PROFILE_UNKNOWN); + + priv = media->priv; + + g_mutex_lock (&priv->lock); + res = priv->profiles; + g_mutex_unlock (&priv->lock); + + return res; +} + static void do_set_protocols (GstRTSPStream * stream, GstRTSPLowerTrans * protocols) { diff --git a/gst/rtsp-server/rtsp-media.h b/gst/rtsp-server/rtsp-media.h index 885960691f..cd38a499ad 100644 --- a/gst/rtsp-server/rtsp-media.h +++ b/gst/rtsp-server/rtsp-media.h @@ -160,6 +160,9 @@ gboolean gst_rtsp_media_is_shared (GstRTSPMedia *media); void gst_rtsp_media_set_reusable (GstRTSPMedia *media, gboolean reusable); gboolean gst_rtsp_media_is_reusable (GstRTSPMedia *media); +void gst_rtsp_media_set_profiles (GstRTSPMedia *media, GstRTSPProfile profiles); +GstRTSPProfile gst_rtsp_media_get_profiles (GstRTSPMedia *media); + void gst_rtsp_media_set_protocols (GstRTSPMedia *media, GstRTSPLowerTrans protocols); GstRTSPLowerTrans gst_rtsp_media_get_protocols (GstRTSPMedia *media); diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index a92b9854c0..ac28bd8bde 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -68,6 +68,7 @@ struct _GstRTSPStreamPrivate gboolean is_joined; gchar *control; + GstRTSPProfile profiles; GstRTSPLowerTrans protocols; /* pads on the rtpbin */ @@ -127,6 +128,7 @@ struct _GstRTSPStreamPrivate }; #define DEFAULT_CONTROL NULL +#define DEFAULT_PROFILES GST_RTSP_PROFILE_AVP #define DEFAULT_PROTOCOLS GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST | \ GST_RTSP_LOWER_TRANS_TCP @@ -134,6 +136,7 @@ enum { PROP_0, PROP_CONTROL, + PROP_PROFILES, PROP_PROTOCOLS, PROP_LAST }; @@ -170,6 +173,11 @@ gst_rtsp_stream_class_init (GstRTSPStreamClass * klass) "The control string for this stream", DEFAULT_CONTROL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROFILES, + g_param_spec_flags ("profiles", "Profiles", + "Allowed transfer profiles", GST_TYPE_RTSP_PROFILE, + DEFAULT_PROFILES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROTOCOLS, g_param_spec_flags ("protocols", "Protocols", "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS, @@ -191,6 +199,7 @@ gst_rtsp_stream_init (GstRTSPStream * stream) priv->dscp_qos = -1; priv->control = g_strdup (DEFAULT_CONTROL); + priv->profiles = DEFAULT_PROFILES; priv->protocols = DEFAULT_PROTOCOLS; g_mutex_init (&priv->lock); @@ -238,6 +247,9 @@ gst_rtsp_stream_get_property (GObject * object, guint propid, case PROP_CONTROL: g_value_take_string (value, gst_rtsp_stream_get_control (stream)); break; + case PROP_PROFILES: + g_value_set_flags (value, gst_rtsp_stream_get_profiles (stream)); + break; case PROP_PROTOCOLS: g_value_set_flags (value, gst_rtsp_stream_get_protocols (stream)); break; @@ -256,6 +268,9 @@ gst_rtsp_stream_set_property (GObject * object, guint propid, case PROP_CONTROL: gst_rtsp_stream_set_control (stream, g_value_get_string (value)); break; + case PROP_PROFILES: + gst_rtsp_stream_set_profiles (stream, g_value_get_flags (value)); + break; case PROP_PROTOCOLS: gst_rtsp_stream_set_protocols (stream, g_value_get_flags (value)); break; @@ -568,7 +583,7 @@ gst_rtsp_stream_is_transport_supported (GstRTSPStream * stream, if (transport->trans != GST_RTSP_TRANS_RTP) goto unsupported_transmode; - if (transport->profile != GST_RTSP_PROFILE_AVP) + if (!(transport->profile & priv->profiles)) goto unsupported_profile; if (!(transport->lower_transport & priv->protocols)) @@ -596,6 +611,52 @@ unsupported_ltrans: } } +/** + * gst_rtsp_stream_set_profiles: + * @stream: a #GstRTSPStream + * @profiles: the new profiles + * + * Configure the allowed profiles for @stream. + */ +void +gst_rtsp_stream_set_profiles (GstRTSPStream * stream, GstRTSPProfile profiles) +{ + GstRTSPStreamPrivate *priv; + + g_return_if_fail (GST_IS_RTSP_STREAM (stream)); + + priv = stream->priv; + + g_mutex_lock (&priv->lock); + priv->profiles = profiles; + g_mutex_unlock (&priv->lock); +} + +/** + * gst_rtsp_stream_get_profiles: + * @stream: a #GstRTSPStream + * + * Get the allowed profiles of @stream. + * + * Returns: a #GstRTSPProfile + */ +GstRTSPProfile +gst_rtsp_stream_get_profiles (GstRTSPStream * stream) +{ + GstRTSPStreamPrivate *priv; + GstRTSPProfile res; + + g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), GST_RTSP_PROFILE_UNKNOWN); + + priv = stream->priv; + + g_mutex_lock (&priv->lock); + res = priv->profiles; + g_mutex_unlock (&priv->lock); + + return res; +} + /** * gst_rtsp_stream_set_protocols: * @stream: a #GstRTSPStream diff --git a/gst/rtsp-server/rtsp-stream.h b/gst/rtsp-server/rtsp-stream.h index 60ea876671..0e465b282b 100644 --- a/gst/rtsp-server/rtsp-stream.h +++ b/gst/rtsp-server/rtsp-stream.h @@ -85,6 +85,9 @@ gint gst_rtsp_stream_get_dscp_qos (GstRTSPStream *stream); gboolean gst_rtsp_stream_is_transport_supported (GstRTSPStream *stream, GstRTSPTransport *transport); +void gst_rtsp_stream_set_profiles (GstRTSPStream *stream, GstRTSPProfile profiles); +GstRTSPProfile gst_rtsp_stream_get_profiles (GstRTSPStream *stream); + void gst_rtsp_stream_set_protocols (GstRTSPStream *stream, GstRTSPLowerTrans protocols); GstRTSPLowerTrans gst_rtsp_stream_get_protocols (GstRTSPStream *stream);