stream: add property to configure profiles
authorWim Taymans <wtaymans@redhat.com>
Tue, 7 Jan 2014 11:21:09 +0000 (12:21 +0100)
committerWim Taymans <wtaymans@redhat.com>
Tue, 7 Jan 2014 11:39:58 +0000 (12:39 +0100)
gst/rtsp-server/rtsp-media.c
gst/rtsp-server/rtsp-media.h
gst/rtsp-server/rtsp-stream.c
gst/rtsp-server/rtsp-stream.h

index 4c361b9..734edec 100644 (file)
@@ -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;
@@ -815,6 +830,59 @@ gst_rtsp_media_is_reusable (GstRTSPMedia * media)
 }
 
 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)
 {
   gst_rtsp_stream_set_protocols (stream, *protocols);
index 8859606..cd38a49 100644 (file)
@@ -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);
 
index a92b985..ac28bd8 100644 (file)
@@ -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))
@@ -597,6 +612,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
  * @protocols: the new flags
index 60ea876..0e465b2 100644 (file)
@@ -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);