All pastes #2088479 Raw Edit

Stuff

public diff v1 · immutable
#2088479 ·published 2011-10-09 21:33 UTC
rendered paste body
From a216b903637a638dcc9e1484aecfeee1f28a1a09 Mon Sep 17 00:00:00 2001From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>Date: Sun, 9 Oct 2011 17:30:09 -0400Subject: [PATCH] rtpsubstream: Restore the capsfilter for the recv caps--- gst/fsrtpconference/fs-rtp-substream.c |   77 ++++++++++++++++++++++++++++++- 1 files changed, 74 insertions(+), 3 deletions(-)diff --git a/gst/fsrtpconference/fs-rtp-substream.c b/gst/fsrtpconference/fs-rtp-substream.cindex 084229e..c5c8183 100644--- a/gst/fsrtpconference/fs-rtp-substream.c+++ b/gst/fsrtpconference/fs-rtp-substream.c@@ -44,7 +44,7 @@  *  * This object controls a part of the receive pipeline, with the following shape  *- * rtpbin_pad -> input_valve -> codecbin -> output_valve -> output_ghostad+ * rtpbin_pad -> input_valve -> capsfilter -> codecbin -> output_valve -> output_ghostad  *  */ @@ -92,6 +92,8 @@ struct _FsRtpSubStreamPrivate {   GstElement *input_valve;   GstElement *output_valve; +  GstElement *capsfilter;+   /* This only exists if the codec is valid,    * otherwise the rtpbin_pad is blocked */   /* Protected by the session mutex */@@ -602,6 +604,36 @@ fs_rtp_sub_stream_constructed (GObject *object)     return;   } +  tmp = g_strdup_printf ("recv_capsfilter_%d_%d_%d", self->priv->session->id,+      self->ssrc, self->pt);+  self->priv->capsfilter = gst_element_factory_make ("capsfilter", tmp);+  g_free (tmp);++  if (!self->priv->capsfilter) {+    self->priv->construction_error = g_error_new (FS_ERROR,+      FS_ERROR_CONSTRUCTION, "Could not create a capsfilter element for"+      " session substream with ssrc: %u and pt:%d", self->ssrc,+      self->pt);+    return;+  }++  if (!gst_bin_add (GST_BIN (self->priv->conference), self->priv->capsfilter)) {+    self->priv->construction_error = g_error_new (FS_ERROR,+      FS_ERROR_CONSTRUCTION, "Could not add the capsfilter element for session"+      " substream with ssrc: %u and pt:%d to the conference bin",+      self->ssrc, self->pt);+    return;+  }++  if (gst_element_set_state (self->priv->capsfilter, GST_STATE_PLAYING) ==+    GST_STATE_CHANGE_FAILURE) {+    self->priv->construction_error = g_error_new (FS_ERROR,+      FS_ERROR_CONSTRUCTION, "Could not set the capsfilter element for session"+      " substream with ssrc: %u and pt:%d to the playing state",+      self->ssrc, self->pt);+    return;+  }+   tmp = g_strdup_printf ("input_recv_valve_%d_%d_%d", self->priv->session->id,       self->ssrc, self->pt);   self->priv->input_valve = gst_element_factory_make ("valve", tmp);@@ -633,6 +665,14 @@ fs_rtp_sub_stream_constructed (GObject *object)     return;   } +  if (!gst_element_link (self->priv->input_valve, self->priv->capsfilter))+  {+    self->priv->construction_error = g_error_new (FS_ERROR,+        FS_ERROR_CONSTRUCTION, "Could not link the input valve"+        " and the capsfilter");+    return;+  }+   valve_sink_pad = gst_element_get_static_pad (self->priv->input_valve,       "sink");   if (!valve_sink_pad)@@ -693,6 +733,13 @@ fs_rtp_sub_stream_dispose (GObject *object)     self->priv->codecbin = NULL;   } +  if (self->priv->capsfilter) {+    gst_element_set_locked_state (self->priv->capsfilter, TRUE);+    gst_element_set_state (self->priv->capsfilter, GST_STATE_NULL);+    gst_bin_remove (GST_BIN (self->priv->conference), self->priv->capsfilter);+    self->priv->capsfilter = NULL;+  }+   if (self->priv->input_valve) {     gst_element_set_locked_state (self->priv->input_valve, TRUE);     gst_element_set_state (self->priv->input_valve, GST_STATE_NULL);@@ -913,11 +960,11 @@ fs_rtp_sub_stream_set_codecbin (FsRtpSubStream *substream,     goto error;   } -  if (!gst_element_link_pads (substream->priv->input_valve, "src",+  if (!gst_element_link_pads (substream->priv->capsfilter, "src",           codecbin, "sink"))   {      g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,-         "Could not link the receive input valve and the codecbin for pt %d",+         "Could not link the receive capsfilter and the codecbin for pt %d",          substream->pt);     goto error;   }@@ -1041,6 +1088,12 @@ fs_rtp_sub_stream_stop (FsRtpSubStream *substream)     gst_element_set_state (substream->priv->codecbin, GST_STATE_NULL);   } +  if (substream->priv->capsfilter)+  {+    gst_element_set_locked_state (substream->priv->capsfilter, TRUE);+    gst_element_set_state (substream->priv->capsfilter, GST_STATE_NULL);+  }+   if (substream->priv->input_valve)   {     gst_element_set_locked_state (substream->priv->input_valve, TRUE);@@ -1299,6 +1352,24 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)   if (error)     goto error; +  FS_RTP_SESSION_LOCK (substream->priv->session);+  if (codec &&+      (!substream->codec || !fs_codec_are_equal (codec, substream->codec)))+  {+    GstCaps *caps;+    gchar *tmp;++    caps = fs_codec_to_gst_caps (codec);+    tmp = gst_caps_to_string (caps);+    GST_DEBUG ("Setting caps %s on recv substream", tmp);+    g_free (tmp);+    g_object_set (substream->priv->capsfilter, "caps", caps, NULL);++    fs_rtp_sub_stream_add_probe_locked (substream);+  }+  FS_RTP_SESSION_UNLOCK (substream->priv->session);++   if (codecbin)     if (!fs_rtp_sub_stream_set_codecbin (substream, codec, codecbin,             new_builder_hash, &error))-- 1.7.6.4