diff options
author | Jonas Holmberg <jonas.holmberg@axis.com> | 2010-03-05 17:18:23 +0100 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-04-09 16:43:12 +0200 |
commit | ac04c8dc9efe93a6fabbf73d45687f1e4f81e4d4 (patch) | |
tree | fa0531a59ae3a6f870c32a63e4eebaa75f05dd44 | |
parent | ba3f4140f3301600459feaea684b7b831aa4d808 (diff) |
queue: Push newsegment when linking in PLAYINGqueue-segment
-rw-r--r-- | plugins/elements/gstqueue.c | 30 | ||||
-rw-r--r-- | plugins/elements/gstqueue.h | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index b8aecda95..48a899638 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -497,6 +497,7 @@ gst_queue_link_src (GstPad * pad, GstPad * peer) if (GST_PAD_LINK_SUCCESSFUL (result)) { GST_QUEUE_MUTEX_LOCK (queue); if (queue->srcresult == GST_FLOW_OK) { + queue->push_newsegment = TRUE; gst_pad_start_task (pad, (GstTaskFunction) gst_queue_loop, pad); GST_DEBUG_OBJECT (queue, "starting task as pad is linked"); } else { @@ -1037,6 +1038,28 @@ out_unexpected: } } +static void +gst_queue_push_newsegment (GstQueue * queue) +{ + GstSegment *s; + GstEvent *event; + + s = &queue->src_segment; + + if (s->accum != 0) { + event = gst_event_new_new_segment_full (FALSE, 1.0, 1.0, s->format, 0, + s->accum, 0); + GST_CAT_LOG_OBJECT (queue_dataflow, queue, + "pushing accum newsegment event"); + gst_pad_push_event (queue->srcpad, event); + } + + event = gst_event_new_new_segment_full (FALSE, s->rate, s->applied_rate, + s->format, s->start, s->stop, s->time); + GST_CAT_LOG_OBJECT (queue_dataflow, queue, "pushing real newsegment event"); + gst_pad_push_event (queue->srcpad, event); +} + /* dequeue an item from the queue an push it downstream. This functions returns * the result of the push. */ static GstFlowReturn @@ -1080,6 +1103,9 @@ next: if (caps && caps != GST_PAD_CAPS (queue->srcpad)) gst_pad_set_caps (queue->srcpad, caps); + if (queue->push_newsegment) { + gst_queue_push_newsegment (queue); + } result = gst_pad_push (queue->srcpad, buffer); /* need to check for srcresult here as well */ @@ -1126,6 +1152,9 @@ next: GST_QUEUE_MUTEX_UNLOCK (queue); + if (queue->push_newsegment && type != GST_EVENT_NEWSEGMENT) { + gst_queue_push_newsegment (queue); + } gst_pad_push_event (queue->srcpad, event); GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing); @@ -1183,6 +1212,7 @@ gst_queue_loop (GstPad * pad) } ret = gst_queue_push_one (queue); + queue->push_newsegment = FALSE; queue->srcresult = ret; if (ret != GST_FLOW_OK) goto out_flushing; diff --git a/plugins/elements/gstqueue.h b/plugins/elements/gstqueue.h index 96c6fe90b..1499c07ca 100644 --- a/plugins/elements/gstqueue.h +++ b/plugins/elements/gstqueue.h @@ -112,6 +112,7 @@ struct _GstQueue { GCond *item_del; /* signals space now available for writing */ gboolean head_needs_discont, tail_needs_discont; + gboolean push_newsegment; }; struct _GstQueueClass { |