outputselector: do the pad_alloc for the pad that is pending and have a fallback
authorStefan Kost <ensonic@users.sf.net>
Fri, 12 Jun 2009 07:14:27 +0000 (10:14 +0300)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 31 Dec 2010 00:53:50 +0000 (00:53 +0000)
We should do the pad_alloc for the pending pad if any, as we will switch to that
pad on next _chain() call. Also do a fallback alloc, if there is no output yet to
not fail state transitions in dynamic pipelines.

plugins/elements/gstoutputselector.c

index 6e93a0a..15c0a72 100644 (file)
@@ -196,7 +196,7 @@ gst_output_selector_set_property (GObject * object, guint prop_id,
 
       next_pad = g_value_get_object (value);
 
-      GST_LOG_OBJECT (sel, "Activating pad %s:%s",
+      GST_INFO_OBJECT (sel, "Activating pad %s:%s",
           GST_DEBUG_PAD_NAME (next_pad));
 
       GST_OBJECT_LOCK (object);
@@ -262,11 +262,11 @@ gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size,
   GstPad *allocpad;
 
   sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad));
-
   res = GST_FLOW_NOT_LINKED;
 
   GST_OBJECT_LOCK (sel);
-  if ((allocpad = sel->active_srcpad)) {
+  allocpad = sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad;
+  if (allocpad) {
     /* if we had a previous pad we used for allocating a buffer, continue using
      * it. */
     GST_DEBUG_OBJECT (sel, "using pad %s:%s for alloc",
@@ -278,9 +278,16 @@ gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size,
     gst_object_unref (allocpad);
 
     GST_OBJECT_LOCK (sel);
+  } else {
+    /* fallback case, allocate a buffer of our own, add pad caps. */
+    GST_DEBUG_OBJECT (pad, "fallback buffer alloc");
+    *buf = NULL;
+    res = GST_FLOW_OK;
   }
   GST_OBJECT_UNLOCK (sel);
 
+  GST_DEBUG_OBJECT (sel, "buffer alloc finished: %s", gst_flow_get_name (res));
+
   return res;
 }