diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2013-12-27 10:49:14 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2013-12-27 10:49:14 +0100 |
commit | d2c0bb76d77ef8e3af100856a5b1865902668983 (patch) | |
tree | 27b8a21247cd30dc636389945f642d54ac7cf77c /plugins | |
parent | 5445f362fd9ff2817de0772ef503db799a42fc62 (diff) |
Imported Upstream version 1.2.2
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/elements/gstfunnel.c | 4 | ||||
-rw-r--r-- | plugins/elements/gstinputselector.c | 21 | ||||
-rw-r--r-- | plugins/elements/gstmultiqueue.c | 12 | ||||
-rw-r--r-- | plugins/elements/gstqueue.c | 18 | ||||
-rw-r--r-- | plugins/elements/gstqueue2.c | 14 |
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: |