rtpsender: Add API to set the priority
authorOlivier Crête <olivier.crete@collabora.com>
Thu, 9 Jul 2020 17:39:03 +0000 (13:39 -0400)
committerOlivier Crête <olivier.crete@collabora.com>
Tue, 6 Oct 2020 20:49:08 +0000 (16:49 -0400)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425>

gst-libs/gst/webrtc/rtpsender.c
gst-libs/gst/webrtc/rtpsender.h

index 3a8a904..e14227c 100644 (file)
@@ -51,10 +51,7 @@ enum
 enum
 {
   PROP_0,
-  PROP_MID,
-  PROP_SENDER,
-  PROP_STOPPED,
-  PROP_DIRECTION,
+  PROP_PRIORITY
 };
 
 //static guint gst_webrtc_rtp_sender_signals[LAST_SIGNAL] = { 0 };
@@ -85,11 +82,38 @@ gst_webrtc_rtp_sender_set_rtcp_transport (GstWebRTCRTPSender * sender,
   GST_OBJECT_UNLOCK (sender);
 }
 
+/**
+ * gst_webrtc_rtp_sender_set_priority:
+ * @sender: a #GstWebRTCRTPSender
+ * @priority: The priority of this sender
+ *
+ * Sets the content of the IPv4 Type of Service (ToS), also known as DSCP
+ * (Differentiated Services Code Point).
+ * This also sets the Traffic Class field of IPv6.
+ *
+ * Since: 1.20
+ */
+
+void
+gst_webrtc_rtp_sender_set_priority (GstWebRTCRTPSender * sender,
+    GstWebRTCPriorityType priority)
+{
+  GST_OBJECT_LOCK (sender);
+  sender->priority = priority;
+  GST_OBJECT_UNLOCK (sender);
+  g_object_notify (G_OBJECT (sender), "priority");
+}
+
 static void
 gst_webrtc_rtp_sender_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
 {
+  GstWebRTCRTPSender *sender = GST_WEBRTC_RTP_SENDER (object);
+
   switch (prop_id) {
+    case PROP_PRIORITY:
+      gst_webrtc_rtp_sender_set_priority (sender, g_value_get_uint (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -100,7 +124,14 @@ static void
 gst_webrtc_rtp_sender_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec)
 {
+  GstWebRTCRTPSender *sender = GST_WEBRTC_RTP_SENDER (object);
+
   switch (prop_id) {
+    case PROP_PRIORITY:
+      GST_OBJECT_LOCK (sender);
+      g_value_set_uint (value, sender->priority);
+      GST_OBJECT_UNLOCK (sender);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -110,15 +141,15 @@ gst_webrtc_rtp_sender_get_property (GObject * object, guint prop_id,
 static void
 gst_webrtc_rtp_sender_finalize (GObject * object)
 {
-  GstWebRTCRTPSender *webrtc = GST_WEBRTC_RTP_SENDER (object);
+  GstWebRTCRTPSender *sender = GST_WEBRTC_RTP_SENDER (object);
 
-  if (webrtc->transport)
-    gst_object_unref (webrtc->transport);
-  webrtc->transport = NULL;
+  if (sender->transport)
+    gst_object_unref (sender->transport);
+  sender->transport = NULL;
 
-  if (webrtc->rtcp_transport)
-    gst_object_unref (webrtc->rtcp_transport);
-  webrtc->rtcp_transport = NULL;
+  if (sender->rtcp_transport)
+    gst_object_unref (sender->rtcp_transport);
+  sender->rtcp_transport = NULL;
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -131,6 +162,21 @@ gst_webrtc_rtp_sender_class_init (GstWebRTCRTPSenderClass * klass)
   gobject_class->get_property = gst_webrtc_rtp_sender_get_property;
   gobject_class->set_property = gst_webrtc_rtp_sender_set_property;
   gobject_class->finalize = gst_webrtc_rtp_sender_finalize;
+
+  /**
+   * GstWebRTCRTPSender:priority:
+   *
+   * The priority from which to set the DSCP field on packets
+   *
+   * Since: 1.20
+   */
+  g_object_class_install_property (gobject_class,
+      PROP_PRIORITY,
+      g_param_spec_enum ("priority",
+          "Priority",
+          "The priority from which to set the DSCP field on packets",
+          GST_TYPE_WEBRTC_PRIORITY_TYPE, GST_WEBRTC_PRIORITY_TYPE_LOW,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 static void
index bcaf93c..0c5c077 100644 (file)
@@ -37,6 +37,10 @@ GType gst_webrtc_rtp_sender_get_type(void);
 
 /**
  * GstWebRTCRTPSender:
+ * @transport: The transport for RTP packets
+ * @rtcp_transport: The transport for RTCP packets without rtcp-mux
+ * @send_encodings: Unused
+ * @priority: The priority of the stream (Since: 1.20)
  */
 struct _GstWebRTCRTPSender
 {
@@ -47,6 +51,7 @@ struct _GstWebRTCRTPSender
   GstWebRTCDTLSTransport            *rtcp_transport;
 
   GArray                            *send_encodings;
+  GstWebRTCPriorityType              priority;
 
   gpointer                          _padding[GST_PADDING];
 };
@@ -67,7 +72,9 @@ void                        gst_webrtc_rtp_sender_set_transport         (GstWebR
 GST_WEBRTC_API
 void                        gst_webrtc_rtp_sender_set_rtcp_transport    (GstWebRTCRTPSender * sender,
                                                                          GstWebRTCDTLSTransport * transport);
-
+GST_WEBRTC_API
+void                        gst_webrtc_rtp_sender_set_priority          (GstWebRTCRTPSender *sender,
+                                                                         GstWebRTCPriorityType priority);
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCRTPSender, gst_object_unref)