webrtc/transceiver: add a set_direction function
authorMatthew Waters <matthew@centricular.com>
Thu, 6 Dec 2018 12:25:54 +0000 (23:25 +1100)
committerMatthew Waters <matthew@centricular.com>
Thu, 30 May 2019 11:33:09 +0000 (21:33 +1000)
Matches the setDirection() from the W3C spec and allows changing the
transceiver direction at the next negotiation cycle.

ext/webrtc/webrtctransceiver.c
gst-libs/gst/webrtc/rtptransceiver.c
gst-libs/gst/webrtc/rtptransceiver.h

index c1a3faa1c2aca1b194b6096345827bb7cf4827f5..64030acdbe4d79f3f4795f92bfaf75e01864bc66 100644 (file)
@@ -97,6 +97,12 @@ webrtc_transceiver_get_rtcp_dtls_transport (GstWebRTCRTPTransceiver * trans)
   return NULL;
 }
 
+static void
+webrtc_transceiver_set_direction (GstWebRTCRTPTransceiver * trans,
+    GstWebRTCRTPTransceiverDirection direction)
+{
+}
+
 static void
 webrtc_transceiver_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
@@ -172,12 +178,16 @@ webrtc_transceiver_finalize (GObject * object)
 static void
 webrtc_transceiver_class_init (WebRTCTransceiverClass * klass)
 {
+  GstWebRTCRTPTransceiverClass *trans_class =
+      (GstWebRTCRTPTransceiverClass *) klass;
   GObjectClass *gobject_class = (GObjectClass *) klass;
 
   gobject_class->get_property = webrtc_transceiver_get_property;
   gobject_class->set_property = webrtc_transceiver_set_property;
   gobject_class->finalize = webrtc_transceiver_finalize;
 
+  trans_class->set_direction = webrtc_transceiver_set_direction;
+
   /* some acrobatics are required to set the parent before _constructed()
    * has been called */
   g_object_class_install_property (gobject_class,
index d0d9628d0f4d191d2cce6615b7857aa723873603..332c1bd0582ad635b2d2f58f150387b23e07ba9b 100644 (file)
@@ -61,6 +61,22 @@ enum
 
 //static guint gst_webrtc_rtp_transceiver_signals[LAST_SIGNAL] = { 0 };
 
+void
+gst_webrtc_rtp_transceiver_set_direction (GstWebRTCRTPTransceiver * trans,
+    GstWebRTCRTPTransceiverDirection direction)
+{
+  GstWebRTCRTPTransceiverClass *trans_class;
+
+  GST_OBJECT_LOCK (trans);
+  trans->direction = direction;
+
+  trans_class = GST_WEBRTC_RTP_TRANSCEIVER_GET_CLASS (trans);
+
+  g_assert (trans_class->set_direction);
+  trans_class->set_direction (trans, direction);
+  GST_OBJECT_UNLOCK (trans);
+}
+
 static void
 gst_webrtc_rtp_transceiver_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
index 4e5c0a5af01b6210f3d221ee83df002a343056ba..78c8a6d7eed427f72ee2dec2c6af51228dec51d9 100644 (file)
@@ -61,13 +61,21 @@ struct _GstWebRTCRTPTransceiverClass
 {
   GstObjectClass        parent_class;
 
-  gpointer              _padding[GST_PADDING];
+  void                  (*set_direction)        (GstWebRTCRTPTransceiver * trans,
+                                                 GstWebRTCRTPTransceiverDirection direction);
+
+  /* FIXME; reset */
+  gpointer              _padding[GST_PADDING-1];
 };
 
 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCRTPTransceiver, gst_object_unref)
 #endif
 
+GST_WEBRTC_API
+void                        gst_webrtc_rtp_transceiver_set_direction (GstWebRTCRTPTransceiver * trans,
+                                                                      GstWebRTCRTPTransceiverDirection direction);
+
 G_END_DECLS
 
 #endif /* __GST_WEBRTC_RTP_TRANSCEIVER_H__ */