summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Holmberg <jonas.holmberg@axis.com>2010-03-05 17:18:23 +0100
committerWim Taymans <wim.taymans@collabora.co.uk>2010-04-09 16:43:12 +0200
commitac04c8dc9efe93a6fabbf73d45687f1e4f81e4d4 (patch)
treefa0531a59ae3a6f870c32a63e4eebaa75f05dd44
parentba3f4140f3301600459feaea684b7b831aa4d808 (diff)
queue: Push newsegment when linking in PLAYINGqueue-segment
-rw-r--r--plugins/elements/gstqueue.c30
-rw-r--r--plugins/elements/gstqueue.h1
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 {