summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--gst/switch/gstswitch.c31
-rw-r--r--gst/switch/gstswitch.h1
3 files changed, 39 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 709e32f6..cd14f1e6 100644
--- 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.
diff --git a/gst/switch/gstswitch.c b/gst/switch/gstswitch.c
index e7456dce..9201e084 100644
--- a/gst/switch/gstswitch.c
+++ b/gst/switch/gstswitch.c
@@ -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);
}
diff --git a/gst/switch/gstswitch.h b/gst/switch/gstswitch.h
index 3bb88204..7ede7346 100644
--- a/gst/switch/gstswitch.h
+++ b/gst/switch/gstswitch.h
@@ -49,6 +49,7 @@ struct _GstStreamSelector {
GstSegment segment;
+ GCond *blocked_cond;
gboolean blocked;
gboolean pending_stop;
GstSegment pending_stop_segment;