[farsight2/master] Also have the sink tees into an array, one per component

Olivier Crête olivier.crete at collabora.co.uk
Tue Dec 23 15:19:39 PST 2008


---
 transmitters/rawudp/fs-rawudp-transmitter.c |  116 ++++++++++++---------------
 1 files changed, 53 insertions(+), 63 deletions(-)

diff --git a/transmitters/rawudp/fs-rawudp-transmitter.c b/transmitters/rawudp/fs-rawudp-transmitter.c
index db1bc7a..758c9fe 100644
--- a/transmitters/rawudp/fs-rawudp-transmitter.c
+++ b/transmitters/rawudp/fs-rawudp-transmitter.c
@@ -73,8 +73,7 @@ struct _FsRawUdpTransmitterPrivate
      by the bins */
   /* They are tables of elements, one per component */
   GstElement **udpsrc_funnels;
-  GstElement *udpsink_tee;
-  GstElement *udprtcpsink_tee;
+  GstElement **udpsink_tees;
 
   GList *rtp_udpports;
   GList *rtcp_udpports;
@@ -187,6 +186,7 @@ fs_rawudp_transmitter_init (FsRawUdpTransmitter *self)
 
   /* We waste one space in order to have the index be the component_id */
   self->priv->udpsrc_funnels = g_new0 (GstElement*, self->components+1);
+  self->priv->udpsink_tees = g_new0 (GstElement*, self->components+1);
 
   /* First we need the src elemnet */
 
@@ -201,9 +201,24 @@ fs_rawudp_transmitter_init (FsRawUdpTransmitter *self)
 
   gst_object_ref (self->priv->gst_src);
 
-  /* Lets create the RTP source funnel */
+
+  /* Second, we do the sink element */
+
+  self->priv->gst_sink = gst_bin_new (NULL);
+
+  if (!self->priv->gst_sink) {
+    trans->construction_error = g_error_new (FS_ERROR,
+      FS_ERROR_CONSTRUCTION,
+      "Could not build the transmitter sink bin");
+    return;
+  }
+
+  gst_object_ref (self->priv->gst_sink);
 
   for (c = 1; c <= self->components; c++) {
+
+    /* Lets create the RTP source funnel */
+
     self->priv->udpsrc_funnels[c] = gst_element_factory_make ("fsfunnel", NULL);
 
     if (!self->priv->udpsrc_funnels[c]) {
@@ -229,69 +244,37 @@ fs_rawudp_transmitter_init (FsRawUdpTransmitter *self)
 
     gst_pad_set_active (ghostpad, TRUE);
     gst_element_add_pad (self->priv->gst_src, ghostpad);
-  }
-
-  /* Second, we do the sink element */
 
-  self->priv->gst_sink = gst_bin_new (NULL);
 
-  if (!self->priv->gst_sink) {
-    trans->construction_error = g_error_new (FS_ERROR,
-      FS_ERROR_CONSTRUCTION,
-      "Could not build the transmitter sink bin");
-    return;
-  }
+    /* Lets create the RTP source tee */
 
-  gst_object_ref (self->priv->gst_sink);
+    self->priv->udpsink_tees[c] = gst_element_factory_make ("tee", NULL);
 
-  /* Lets create the RTP source tee */
-
-  self->priv->udpsink_tee = gst_element_factory_make ("tee", NULL);
-
-  if (!self->priv->udpsink_tee) {
-    trans->construction_error = g_error_new (FS_ERROR,
-      FS_ERROR_CONSTRUCTION,
-      "Could not make the tee element");
-    return;
-  }
-
-  if (!gst_bin_add (GST_BIN (self->priv->gst_sink), self->priv->udpsink_tee)) {
-    trans->construction_error = g_error_new (FS_ERROR,
-      FS_ERROR_CONSTRUCTION,
-      "Could not add the tee element to the transmitter sink bin");
-  }
-
-  pad = gst_element_get_static_pad (self->priv->udpsink_tee, "sink");
-  ghostpad = gst_ghost_pad_new ("sink", pad);
-  gst_object_unref (pad);
-
-  gst_pad_set_active (ghostpad, TRUE);
-  gst_element_add_pad (self->priv->gst_sink, ghostpad);
+    if (!self->priv->udpsink_tees[c]) {
+      trans->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION,
+        "Could not make the tee element");
+      return;
+    }
 
-  /* Lets create the RTCP source tee*/
+    if (!gst_bin_add (GST_BIN (self->priv->gst_sink),
+        self->priv->udpsink_tees[c])) {
+      trans->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION,
+        "Could not add the tee element to the transmitter sink bin");
+    }
 
-  self->priv->udprtcpsink_tee = gst_element_factory_make ("tee", NULL);
+    pad = gst_element_get_static_pad (self->priv->udpsink_tees[c], "sink");
+    if (c == FS_COMPONENT_RTP)
+      ghostpad = gst_ghost_pad_new ("sink", pad);
+    else if (c == FS_COMPONENT_RTCP)
+      ghostpad = gst_ghost_pad_new ("rtcpsink", pad);
+    gst_object_unref (pad);
 
-  if (!self->priv->udprtcpsink_tee) {
-    trans->construction_error = g_error_new (FS_ERROR,
-      FS_ERROR_CONSTRUCTION,
-      "Could not make the fsfunnnel element");
-    return;
-  }
+    gst_pad_set_active (ghostpad, TRUE);
+    gst_element_add_pad (self->priv->gst_sink, ghostpad);
 
-  if (!gst_bin_add (GST_BIN (self->priv->gst_sink),
-      self->priv->udprtcpsink_tee)) {
-    trans->construction_error = g_error_new (FS_ERROR,
-      FS_ERROR_CONSTRUCTION,
-      "Could not add the rtcp tee element to the transmitter sink bin");
   }
-
-  pad = gst_element_get_static_pad (self->priv->udprtcpsink_tee, "sink");
-  ghostpad = gst_ghost_pad_new ("rtcpsink", pad);
-  gst_object_unref (pad);
-
-  gst_pad_set_active (ghostpad, TRUE);
-  gst_element_add_pad (self->priv->gst_sink, ghostpad);
 }
 
 static void
@@ -323,6 +306,18 @@ fs_rawudp_transmitter_dispose (GObject *object)
 static void
 fs_rawudp_transmitter_finalize (GObject *object)
 {
+  FsRawUdpTransmitter *self = FS_RAWUDP_TRANSMITTER (object);
+
+  if (self->priv->udpsrc_funnels) {
+    g_free (self->priv->udpsrc_funnels);
+    self->priv->udpsrc_funnels = NULL;
+  }
+
+  if (self->priv->udpsink_tees) {
+    g_free (self->priv->udpsink_tees);
+    self->priv->udpsink_tees = NULL;
+  }
+
   parent_class->finalize (object);
 }
 
@@ -597,12 +592,7 @@ fs_rawudp_transmitter_get_udpport (FsRawUdpTransmitter *trans,
 
   /* Now lets create the elements */
 
-  if (component_id == FS_COMPONENT_RTP) {
-    udpport->tee = trans->priv->udpsink_tee;
-  } else if (component_id == FS_COMPONENT_RTCP) {
-    udpport->tee = trans->priv->udprtcpsink_tee;
-  }
-
+  udpport->tee = trans->priv->udpsink_tees[component_id];
   udpport->funnel = trans->priv->udpsrc_funnels[component_id];
 
   udpport->udpsrc = _create_sinksource ("udpsrc",
-- 
1.5.6.5




More information about the farsight-commits mailing list