aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2013-12-27 10:49:14 +0100
committerSebastian Dröge <sebastian@centricular.com>2013-12-27 10:49:14 +0100
commitd2c0bb76d77ef8e3af100856a5b1865902668983 (patch)
tree27b8a21247cd30dc636389945f642d54ac7cf77c /plugins
parent5445f362fd9ff2817de0772ef503db799a42fc62 (diff)
Imported Upstream version 1.2.2
Diffstat (limited to 'plugins')
-rw-r--r--plugins/elements/gstfunnel.c4
-rw-r--r--plugins/elements/gstinputselector.c21
-rw-r--r--plugins/elements/gstmultiqueue.c12
-rw-r--r--plugins/elements/gstqueue.c18
-rw-r--r--plugins/elements/gstqueue2.c14
5 files changed, 49 insertions, 20 deletions
diff --git a/plugins/elements/gstfunnel.c b/plugins/elements/gstfunnel.c
index af3a1ac..6a7dde5 100644
--- a/plugins/elements/gstfunnel.c
+++ b/plugins/elements/gstfunnel.c
@@ -120,6 +120,7 @@ gst_funnel_init (GstFunnel * funnel)
funnel->srcpad = gst_pad_new_from_static_template (&funnel_src_template,
"src");
gst_pad_use_fixed_caps (funnel->srcpad);
+
gst_element_add_pad (GST_ELEMENT (funnel), funnel->srcpad);
}
@@ -138,6 +139,9 @@ gst_funnel_request_new_pad (GstElement * element, GstPadTemplate * templ,
gst_pad_set_event_function (sinkpad,
GST_DEBUG_FUNCPTR (gst_funnel_sink_event));
+ GST_OBJECT_FLAG_SET (sinkpad, GST_PAD_FLAG_PROXY_CAPS);
+ GST_OBJECT_FLAG_SET (sinkpad, GST_PAD_FLAG_PROXY_ALLOCATION);
+
gst_pad_set_active (sinkpad, TRUE);
gst_element_add_pad (element, sinkpad);
diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c
index 7eda5a2..84e2c7b 100644
--- a/plugins/elements/gstinputselector.c
+++ b/plugins/elements/gstinputselector.c
@@ -553,6 +553,27 @@ gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event)
}
GST_DEBUG_OBJECT (pad, "received EOS");
break;
+ case GST_EVENT_GAP:{
+ GstClockTime ts, dur;
+
+ GST_DEBUG_OBJECT (pad, "Received gap event: %" GST_PTR_FORMAT, event);
+
+ gst_event_parse_gap (event, &ts, &dur);
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ if (GST_CLOCK_TIME_IS_VALID (dur))
+ ts += dur;
+
+ /* update the segment position */
+ GST_OBJECT_LOCK (pad);
+ selpad->position = ts;
+ selpad->segment.position = ts;
+ GST_OBJECT_UNLOCK (pad);
+ if (sel->sync_streams && active_sinkpad == pad)
+ GST_INPUT_SELECTOR_BROADCAST (sel);
+ }
+
+ }
+ break;
default:
break;
}
diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c
index 8a7a45e..266fead 100644
--- a/plugins/elements/gstmultiqueue.c
+++ b/plugins/elements/gstmultiqueue.c
@@ -836,7 +836,7 @@ update_buffering (GstMultiQueue * mq, GstSingleQueue * sq)
size.bytes, sq->max_size.bytes, sq->cur_time, sq->max_size.time);
/* get bytes and time percentages and take the max */
- if (sq->is_eos) {
+ if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED) {
percent = 100;
} else {
percent = 0;
@@ -1197,6 +1197,7 @@ gst_multi_queue_loop (GstPad * pad)
GstFlowReturn result;
GstClockTime next_time;
gboolean is_buffer;
+ gboolean do_update_buffering = FALSE;
sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
mq = sq->mqueue;
@@ -1348,6 +1349,7 @@ gst_multi_queue_loop (GstPad * pad)
sq->id);
compute_high_id (mq);
+ do_update_buffering = TRUE;
/* maybe no-one is waiting */
if (mq->numwaiting > 0) {
@@ -1369,6 +1371,10 @@ gst_multi_queue_loop (GstPad * pad)
sq->pushed = TRUE;
sq->srcresult = result;
sq->last_oldid = newid;
+
+ if (do_update_buffering)
+ update_buffering (mq, sq);
+
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
if (result != GST_FLOW_OK && result != GST_FLOW_NOT_LINKED
@@ -1731,8 +1737,10 @@ gst_multi_queue_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_RECONFIGURE:
GST_MULTI_QUEUE_MUTEX_LOCK (mq);
- if (sq->srcresult == GST_FLOW_NOT_LINKED)
+ if (sq->srcresult == GST_FLOW_NOT_LINKED) {
sq->srcresult = GST_FLOW_OK;
+ g_cond_signal (&sq->turn);
+ }
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
ret = gst_pad_push_event (sq->sinkpad, event);
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
index eb50c13..ab19e9b 100644
--- a/plugins/elements/gstqueue.c
+++ b/plugins/elements/gstqueue.c
@@ -753,16 +753,16 @@ no_item:
static gboolean
gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
+ gboolean ret = TRUE;
GstQueue *queue;
queue = GST_QUEUE (parent);
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_FLUSH_START:
- {
STATUS (queue, pad, "received flush start event");
/* forward event */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
/* now unblock the chain function */
GST_QUEUE_MUTEX_LOCK (queue);
@@ -778,13 +778,11 @@ gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
* flush_start downstream. */
gst_pad_pause_task (queue->srcpad);
GST_CAT_LOG_OBJECT (queue_dataflow, queue, "loop stopped");
- goto done;
- }
+ break;
case GST_EVENT_FLUSH_STOP:
- {
STATUS (queue, pad, "received flush stop event");
/* forward event */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
GST_QUEUE_MUTEX_LOCK (queue);
gst_queue_locked_flush (queue, FALSE);
@@ -796,8 +794,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
GST_QUEUE_MUTEX_UNLOCK (queue);
STATUS (queue, pad, "after flush");
- goto done;
- }
+ break;
default:
if (GST_EVENT_IS_SERIALIZED (event)) {
/* serialized events go in the queue */
@@ -819,12 +816,11 @@ gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
GST_QUEUE_MUTEX_UNLOCK (queue);
} else {
/* non-serialized events are forwarded downstream immediately */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
}
break;
}
-done:
- return TRUE;
+ return ret;
/* ERRORS */
out_eos:
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index 2452385..f675a45 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -2186,6 +2186,7 @@ static gboolean
gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event)
{
+ gboolean ret = TRUE;
GstQueue2 *queue;
queue = GST_QUEUE2 (parent);
@@ -2196,7 +2197,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received flush start event");
if (GST_PAD_MODE (queue->srcpad) == GST_PAD_MODE_PUSH) {
/* forward event */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
/* now unblock the chain function */
GST_QUEUE2_MUTEX_LOCK (queue);
@@ -2224,7 +2225,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
gst_event_unref (event);
}
- goto done;
+ break;
}
case GST_EVENT_FLUSH_STOP:
{
@@ -2232,7 +2233,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
if (GST_PAD_MODE (queue->srcpad) == GST_PAD_MODE_PUSH) {
/* forward event */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
GST_QUEUE2_MUTEX_LOCK (queue);
gst_queue2_locked_flush (queue, FALSE);
@@ -2257,7 +2258,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
gst_event_unref (event);
}
- goto done;
+ break;
}
default:
if (GST_EVENT_IS_SERIALIZED (event)) {
@@ -2270,12 +2271,11 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
GST_QUEUE2_MUTEX_UNLOCK (queue);
} else {
/* non-serialized events are passed upstream. */
- gst_pad_push_event (queue->srcpad, event);
+ ret = gst_pad_push_event (queue->srcpad, event);
}
break;
}
-done:
- return TRUE;
+ return ret;
/* ERRORS */
out_flushing: