summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2014-05-02 16:10:15 -0400
committerNicolas Dufresne <nicolas.dufresne@collabora.co.uk>2014-09-18 13:38:00 -0400
commit9d4e85377d991abeb01de9c9aac77d2c70fbeef3 (patch)
tree1c7285785c113af14a0fd546ef2c3c31ec15a998 /gst
parent7a68e77830e4c8472f52bdf39272b86da35bc4aa (diff)
downloadfarstream-9d4e85377d991abeb01de9c9aac77d2c70fbeef3.tar.gz
rtpsession: Create srtpenc & srtpdec
Diffstat (limited to 'gst')
-rw-r--r--gst/fsrtpconference/fs-rtp-session.c176
1 files changed, 143 insertions, 33 deletions
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index 9e508f42..10fa5e99 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -133,6 +133,8 @@ struct _FsRtpSessionPrivate
GstElement *transmitter_rtcp_funnel;
GstElement *rtpmuxer;
+ GstElement *srtpenc;
+ GstElement *srtpdec;
GObject *rtpbin_internal_session;
@@ -730,6 +732,9 @@ fs_rtp_session_dispose (GObject *obj)
self->priv->rtpbin_recv_rtcp_sink = NULL;
}
+ g_clear_object (&self->priv->srtpenc);
+ g_clear_object (&self->priv->srtpdec);
+
if (self->priv->transmitters)
{
g_hash_table_foreach (self->priv->transmitters, _remove_transmitter,
@@ -1066,6 +1071,33 @@ _rtp_tfrc_bitrate_changed (GObject *rtp_tfrc, GParamSpec *pspec,
fs_rtp_session_set_send_bitrate (self, bitrate);
}
+
+
+static GstElement *
+_rtpbin_request_encoder (GstElement *rtpbin, guint session_id,
+ gpointer user_data)
+{
+ FsRtpSession *self = FS_RTP_SESSION (user_data);
+
+ if (self->id == session_id) {
+ return gst_object_ref (self->priv->srtpenc);
+ } else {
+ return NULL;
+ }
+}
+
+static GstElement *
+_rtpbin_request_decoder (GstElement *rtpbin, guint session_id,
+ gpointer user_data)
+{
+ FsRtpSession *self = FS_RTP_SESSION (user_data);
+
+ if (self->id == session_id)
+ return gst_object_ref (self->priv->srtpdec);
+ else
+ return NULL;
+}
+
static void
fs_rtp_session_constructed (GObject *object)
{
@@ -1083,6 +1115,10 @@ fs_rtp_session_constructed (GObject *object)
GstPad *pad;
GstPadLinkReturn ret;
gchar *tmp;
+ gulong request_rtp_encoder_id = 0;
+ gulong request_rtp_decoder_id = 0;
+ gulong request_rtcp_encoder_id = 0;
+ gulong request_rtcp_decoder_id = 0;
if (self->id == 0)
{
@@ -1197,6 +1233,113 @@ fs_rtp_session_constructed (GObject *object)
gst_object_unref (tee_sink_pad);
+ /* Create the SRTP encoder & decoder */
+
+ tmp = g_strdup_printf ("srtpenc_%u", self->id);
+ self->priv->srtpenc = gst_element_factory_make ("srtpenc", tmp);
+ g_free (tmp);
+ if (self->priv->srtpenc) {
+ GstPad *tmppad;
+ gst_object_ref_sink (self->priv->srtpenc);
+
+ g_object_set (self->priv->srtpenc,
+ "rtp-cipher", 0, "rtp-auth", 0, "rtcp-cipher", 0, "rtcp-auth", 0, NULL);
+
+ tmp = g_strdup_printf ("rtp_sink_%u", self->id);
+ tmppad = gst_element_get_request_pad (self->priv->srtpenc, tmp);
+ gst_object_unref (tmppad);
+ g_free (tmp);
+
+ tmp = g_strdup_printf ("rtcp_sink_%u", self->id);
+ tmppad = gst_element_get_request_pad (self->priv->srtpenc, tmp);
+ gst_object_unref (tmppad);
+ g_free (tmp);
+ }
+ tmp = g_strdup_printf ("srtpdec_%u", self->id);
+ self->priv->srtpdec = gst_element_factory_make ("srtpdec", tmp);
+ g_free (tmp);
+ if (self->priv->srtpdec)
+ gst_object_ref_sink (self->priv->srtpdec);
+
+ request_rtp_encoder_id =
+ g_signal_connect (self->priv->conference->rtpbin, "request-rtp-encoder",
+ G_CALLBACK (_rtpbin_request_encoder), self);
+ request_rtp_decoder_id =
+ g_signal_connect (self->priv->conference->rtpbin, "request-rtp-decoder",
+ G_CALLBACK (_rtpbin_request_decoder), self);
+ request_rtcp_encoder_id =
+ g_signal_connect (self->priv->conference->rtpbin, "request-rtcp-encoder",
+ G_CALLBACK (_rtpbin_request_encoder), self);
+ request_rtcp_decoder_id =
+ g_signal_connect (self->priv->conference->rtpbin, "request-rtcp-decoder",
+ G_CALLBACK (_rtpbin_request_decoder), self);
+
+ /* Request the parts of rtpbin */
+
+
+ tmp = g_strdup_printf ("recv_rtp_sink_%u", self->id);
+ self->priv->rtpbin_recv_rtp_sink =
+ gst_element_get_request_pad (self->priv->conference->rtpbin, tmp);
+ g_free (tmp);
+
+ tmp = g_strdup_printf ("recv_rtcp_sink_%u", self->id);
+ self->priv->rtpbin_recv_rtcp_sink =
+ gst_element_get_request_pad (self->priv->conference->rtpbin,
+ tmp);
+ g_free (tmp);
+
+ tmp = g_strdup_printf ("send_rtp_sink_%u", self->id);
+ self->priv->rtpbin_send_rtp_sink =
+ gst_element_get_request_pad (self->priv->conference->rtpbin, tmp);
+ g_free (tmp);
+
+ tmp = g_strdup_printf ("send_rtcp_src_%u", self->id);
+ self->priv->rtpbin_send_rtcp_src =
+ gst_element_get_request_pad (self->priv->conference->rtpbin, tmp);
+ g_free (tmp);
+
+ g_signal_handler_disconnect (self->priv->conference->rtpbin,
+ request_rtp_encoder_id);
+ g_signal_handler_disconnect (self->priv->conference->rtpbin,
+ request_rtp_decoder_id);
+ g_signal_handler_disconnect (self->priv->conference->rtpbin,
+ request_rtcp_encoder_id);
+ g_signal_handler_disconnect (self->priv->conference->rtpbin,
+ request_rtcp_decoder_id);
+
+ if (!self->priv->rtpbin_recv_rtp_sink)
+ {
+ self->priv->construction_error = g_error_new (FS_ERROR,
+ FS_ERROR_CONSTRUCTION,
+ "Could not get recv_rtp_sink_%u request pad from the rtpbin",
+ self->id);
+ return;
+ }
+ if (!self->priv->rtpbin_recv_rtcp_sink)
+ {
+ self->priv->construction_error = g_error_new (FS_ERROR,
+ FS_ERROR_CONSTRUCTION,
+ "Could not get recv_rtcp_sink_%u request pad from the rtpbin",
+ self->id);
+ return;
+ }
+ if (!self->priv->rtpbin_send_rtp_sink)
+ {
+ self->priv->construction_error = g_error_new (FS_ERROR,
+ FS_ERROR_CONSTRUCTION,
+ "Could not get send_rtp_sink_%u request pad from the rtpbin",
+ self->id);
+ return;
+ }
+ if (!self->priv->rtpbin_send_rtcp_src)
+ {
+ self->priv->construction_error = g_error_new (FS_ERROR,
+ FS_ERROR_CONSTRUCTION,
+ "Could not get send_rtcp_src_%u request pad from the rtpbin",
+ self->id);
+ return;
+ }
+
self->priv->send_tee_discovery_pad = gst_element_get_request_pad (tee,
"src_%u");
self->priv->send_tee_media_pad = gst_element_get_request_pad (tee,
@@ -1319,12 +1462,6 @@ fs_rtp_session_constructed (GObject *object)
self->priv->transmitter_rtp_funnel = gst_object_ref (funnel);
- tmp = g_strdup_printf ("recv_rtp_sink_%u", self->id);
- self->priv->rtpbin_recv_rtp_sink =
- gst_element_get_request_pad (self->priv->conference->rtpbin,
- tmp);
- g_free (tmp);
-
funnel_src_pad = gst_element_get_static_pad (funnel, "src");
ret = gst_pad_link (funnel_src_pad, self->priv->rtpbin_recv_rtp_sink);
@@ -1370,12 +1507,6 @@ fs_rtp_session_constructed (GObject *object)
self->priv->transmitter_rtcp_funnel = gst_object_ref (funnel);
- tmp = g_strdup_printf ("recv_rtcp_sink_%u", self->id);
- self->priv->rtpbin_recv_rtcp_sink =
- gst_element_get_request_pad (self->priv->conference->rtpbin,
- tmp);
- g_free (tmp);
-
funnel_src_pad = gst_element_get_static_pad (funnel, "src");
ret = gst_pad_link (funnel_src_pad, self->priv->rtpbin_recv_rtcp_sink);
@@ -1445,13 +1576,6 @@ fs_rtp_session_constructed (GObject *object)
self->priv->rtpmuxer = gst_object_ref (muxer);
- tmp = g_strdup_printf ("send_rtp_sink_%u", self->id);
- self->priv->rtpbin_send_rtp_sink =
- gst_element_get_request_pad (self->priv->conference->rtpbin,
- tmp);
- g_free (tmp);
-
-
g_signal_connect_object (self->priv->rtpbin_send_rtp_sink, "notify::caps",
G_CALLBACK (_rtpbin_send_rtp_sink_notify_caps), self, 0);
@@ -1555,20 +1679,6 @@ fs_rtp_session_constructed (GObject *object)
self->priv->transmitter_rtcp_tee = gst_object_ref (tee);
- tmp = g_strdup_printf ("send_rtcp_src_%u", self->id);
- self->priv->rtpbin_send_rtcp_src =
- gst_element_get_request_pad (self->priv->conference->rtpbin, tmp);
-
- if (!self->priv->rtpbin_send_rtcp_src)
- {
- self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION,
- "Could not get %s request pad from the rtpbin", tmp);
- g_free (tmp);
- return;
- }
- g_free (tmp);
-
transmitter_rtcp_tee_sink_pad =
gst_element_get_static_pad (self->priv->transmitter_rtcp_tee, "sink");