gst/switch/gstswitch.h (struct _GstStreamSelector): gst/switch/gstswitch.c (gst_strea...
authorAndy Wingo <wingo@pobox.com>
Mon, 17 Dec 2007 15:00:15 +0000 (15:00 +0000)
committerAndy Wingo <wingo@pobox.com>
Mon, 17 Dec 2007 15:00:15 +0000 (15:00 +0000)
Original commit message from CVS:
2007-12-17  Andy Wingo  <wingo@pobox.com>

* gst/switch/gstswitch.h (struct _GstStreamSelector):

* gst/switch/gstswitch.c (gst_stream_selector_wait)
(gst_selector_pad_chain, gst_stream_selector_init)
(gst_stream_selector_dispose): Add infrastructure for new blocking
mechanism that does not use gst_pad_set_blocked, which does not
work on sink pads. Patch 7/12.

ChangeLog
gst/switch/gstswitch.c
gst/switch/gstswitch.h

index 709e32f66b557732a34a5b3319d4575862ba1c36..cd14f1e6ca923a1fa0319c4b98fe9ee1a4f46769 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2007-12-17  Andy Wingo  <wingo@pobox.com>
 
+       * gst/switch/gstswitch.h (struct _GstStreamSelector): 
+
+       * gst/switch/gstswitch.c (gst_stream_selector_wait)
+       (gst_selector_pad_chain, gst_stream_selector_init)
+       (gst_stream_selector_dispose): Add infrastructure for new blocking
+       mechanism that does not use gst_pad_set_blocked, which does not
+       work on sink pads. Patch 7/12.
+
        * gst/switch/gstswitch.c (gst_stream_selector_class_init)
        (gst_stream_selector_get_property): Add last-stop-time readable
        property. Patch 6/12.
index e7456dced62a354b772491823d64161a49286787..9201e0848abeb891a72fb7307136dc1ded3b9cc1 100644 (file)
@@ -314,6 +314,25 @@ gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset,
   return result;
 }
 
+static gboolean
+gst_stream_selector_wait (GstStreamSelector * self, GstPad * pad)
+{
+  gboolean flushing;
+
+  GST_OBJECT_LOCK (self);
+
+  while (self->blocked)
+    g_cond_wait (self->blocked_cond, GST_OBJECT_GET_LOCK (self));
+
+  GST_OBJECT_UNLOCK (self);
+
+  GST_OBJECT_LOCK (pad);
+  flushing = GST_PAD_IS_FLUSHING (pad);
+  GST_OBJECT_UNLOCK (pad);
+
+  return flushing;
+}
+
 static GstFlowReturn
 gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
 {
@@ -328,6 +347,9 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
   selpad = GST_SELECTOR_PAD_CAST (pad);
   seg = &selpad->segment;
 
+  if (gst_stream_selector_wait (sel, pad))
+    goto ignore;
+
   active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
 
   timestamp = GST_BUFFER_TIMESTAMP (buf);
@@ -368,7 +390,6 @@ ignore:
     res = GST_FLOW_NOT_LINKED;
     goto done;
   }
-
 }
 
 static void gst_stream_selector_dispose (GObject * object);
@@ -497,6 +518,9 @@ gst_stream_selector_init (GstStreamSelector * sel)
   sel->active_sinkpad = NULL;
   sel->nb_sinkpads = 0;
   gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
+
+  sel->blocked_cond = g_cond_new ();
+  sel->blocked = FALSE;
 }
 
 static void
@@ -509,6 +533,11 @@ gst_stream_selector_dispose (GObject * object)
     sel->active_sinkpad = NULL;
   }
 
+  if (sel->blocked_cond) {
+    g_cond_free (sel->blocked_cond);
+    sel->blocked_cond = NULL;
+  }
+
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
index 3bb8820492fa37679d5a56be708605d584f13932..7ede73465677ec2e397719b45365fc6cf6fe5487 100644 (file)
@@ -49,6 +49,7 @@ struct _GstStreamSelector {
 
   GstSegment segment;
 
+  GCond *blocked_cond;
   gboolean blocked;
   gboolean pending_stop;
   GstSegment pending_stop_segment;