plugins: use the caps event
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 7 Jun 2011 08:04:52 +0000 (10:04 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 7 Jun 2011 08:04:52 +0000 (10:04 +0200)
Use the caps event and avoid using the setcaps function. Use some of the new pad
forward functions to implement desired behaviour.

plugins/elements/gstoutputselector.c
plugins/elements/gsttee.c

index 4945aed..7964c39 100644 (file)
@@ -309,27 +309,6 @@ gst_output_selector_sink_getcaps (GstPad * pad, GstCaps * filter)
   return caps;
 }
 
-static gboolean
-gst_output_selector_sink_setcaps (GstPad * pad, GstCaps * caps)
-{
-  GstOutputSelector *sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad));
-  GstPad *active = NULL;
-  gboolean ret = TRUE;
-
-  GST_OBJECT_LOCK (sel);
-  if (sel->pending_srcpad)
-    active = gst_object_ref (sel->pending_srcpad);
-  else if (sel->active_srcpad)
-    active = gst_object_ref (sel->active_srcpad);
-  GST_OBJECT_UNLOCK (sel);
-
-  if (active) {
-    ret = gst_pad_set_caps (active, caps);
-    gst_object_unref (active);
-  }
-  return ret;
-}
-
 static void
 gst_output_selector_switch_pad_negotiation_mode (GstOutputSelector * sel,
     gint mode)
@@ -337,15 +316,11 @@ gst_output_selector_switch_pad_negotiation_mode (GstOutputSelector * sel,
   sel->pad_negotiation_mode = mode;
   if (mode == GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL) {
     gst_pad_set_getcaps_function (sel->sinkpad, gst_pad_proxy_getcaps);
-    gst_pad_set_setcaps_function (sel->sinkpad, gst_pad_proxy_setcaps);
   } else if (mode == GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE) {
     gst_pad_set_getcaps_function (sel->sinkpad, NULL);
-    gst_pad_set_setcaps_function (sel->sinkpad, NULL);
   } else {                      /* active */
     gst_pad_set_getcaps_function (sel->sinkpad,
         gst_output_selector_sink_getcaps);
-    gst_pad_set_setcaps_function (sel->sinkpad,
-        gst_output_selector_sink_setcaps);
   }
 }
 
@@ -549,7 +524,7 @@ gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
 {
   gboolean res = TRUE;
   GstOutputSelector *sel;
-  GstPad *output_pad = NULL;
+  GstPad *active = NULL;
 
   sel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
   if (G_UNLIKELY (sel == NULL)) {
@@ -558,28 +533,64 @@ gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
   }
 
   switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_CAPS:
+    {
+      switch (sel->pad_negotiation_mode) {
+        case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL:
+          /* Send caps to all src pads */
+          gst_pad_event_forward (pad, event);
+          break;
+        case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE:
+          break;
+        default:
+          GST_OBJECT_LOCK (sel);
+          if (sel->pending_srcpad)
+            active = gst_object_ref (sel->pending_srcpad);
+          else if (sel->active_srcpad)
+            active = gst_object_ref (sel->active_srcpad);
+          GST_OBJECT_UNLOCK (sel);
+
+          if (active) {
+            res = gst_pad_push_event (active, gst_event_ref (event));
+            gst_object_unref (active);
+          }
+          break;
+      }
+      gst_event_unref (event);
+      break;
+    }
     case GST_EVENT_SEGMENT:
     {
       gst_event_copy_segment (event, &sel->segment);
 
-      GST_DEBUG_OBJECT (sel, "configured SEGMENT update %" GST_SEGMENT_FORMAT,
+      GST_DEBUG_OBJECT (sel, "configured SEGMENT %" GST_SEGMENT_FORMAT,
           &sel->segment);
 
       /* Send newsegment to all src pads */
-      gst_pad_event_default (pad, event);
+      res = gst_pad_event_default (pad, event);
       break;
     }
     case GST_EVENT_EOS:
       /* Send eos to all src pads */
-      gst_pad_event_default (pad, event);
+      res = gst_pad_event_default (pad, event);
       break;
     default:
+    {
+      GST_OBJECT_LOCK (sel);
+      if (sel->pending_srcpad)
+        active = gst_object_ref (sel->pending_srcpad);
+      else if (sel->active_srcpad)
+        active = gst_object_ref (sel->active_srcpad);
+      GST_OBJECT_UNLOCK (sel);
+
       /* Send other events to pending or active src pad */
-      output_pad =
-          sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad;
-      if (output_pad)
-        res = gst_pad_push_event (output_pad, event);
+      if (active) {
+        res = gst_pad_push_event (active, gst_event_ref (event));
+        gst_object_unref (active);
+      }
+      gst_event_unref (event);
       break;
+    }
   }
 
   gst_object_unref (sel);
index 304ab3b..3de6878 100644 (file)
@@ -137,6 +137,7 @@ static void gst_tee_dispose (GObject * object);
 
 static GstFlowReturn gst_tee_chain (GstPad * pad, GstBuffer * buffer);
 static GstFlowReturn gst_tee_chain_list (GstPad * pad, GstBufferList * list);
+static gboolean gst_tee_sink_event (GstPad * pad, GstEvent * event);
 static gboolean gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps);
 static gboolean gst_tee_sink_activate_push (GstPad * pad, gboolean active);
 static gboolean gst_tee_src_query (GstPad * pad, GstQuery * query);
@@ -245,8 +246,8 @@ gst_tee_init (GstTee * tee)
   tee->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
   tee->sink_mode = GST_ACTIVATE_NONE;
 
-  gst_pad_set_setcaps_function (tee->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps));
+  gst_pad_set_event_function (tee->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_tee_sink_event));
   gst_pad_set_getcaps_function (tee->sinkpad,
       GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
   gst_pad_set_acceptcaps_function (tee->sinkpad,
@@ -477,6 +478,22 @@ gst_tee_get_property (GObject * object, guint prop_id, GValue * value,
   GST_OBJECT_UNLOCK (tee);
 }
 
+static gboolean
+gst_tee_sink_event (GstPad * pad, GstEvent * event)
+{
+  gboolean res;
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_CAPS:
+      res = gst_pad_event_forward (pad, event);
+      break;
+    default:
+      res = gst_pad_event_default (pad, event);
+      break;
+  }
+  return res;
+}
+
 /* on the sink we accept caps that are acceptable to all srcpads */
 static gboolean
 gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps)