summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-10-02 11:00:32 +0300
committerSebastian Dröge <sebastian@centricular.com>2014-10-14 09:39:05 +0200
commit47c5d48e5899320a2f4258884e152690708ce13a (patch)
treef6926dcd405d890ee3b49c62204434051b7e38e2 /plugins
parent18a5f7ba9837a9aa189baaf578f142054b3268a7 (diff)
downloadgstreamer-47c5d48e5899320a2f4258884e152690708ce13a.tar.gz
queue: update segment position on GAP events to calculate levels properly
https://bugzilla.gnome.org/show_bug.cgi?id=737498
Diffstat (limited to 'plugins')
-rw-r--r--plugins/elements/gstqueue.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
index 77ccdc3c4a..35ad37fd2d 100644
--- a/plugins/elements/gstqueue.c
+++ b/plugins/elements/gstqueue.c
@@ -548,6 +548,34 @@ apply_segment (GstQueue * queue, GstEvent * event, GstSegment * segment,
update_time_level (queue);
}
+static void
+apply_gap (GstQueue * queue, GstEvent * event,
+ GstSegment * segment, gboolean is_sink)
+{
+ GstClockTime timestamp;
+ GstClockTime duration;
+
+ gst_event_parse_gap (event, &timestamp, &duration);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ timestamp += duration;
+ }
+
+ segment->position = timestamp;
+
+ if (is_sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+ /* calc diff with other end */
+ update_time_level (queue);
+ }
+}
+
+
/* take a buffer and update segment, updating the time level of the queue. */
static void
apply_buffer (GstQueue * queue, GstBuffer * buffer, GstSegment * segment,
@@ -666,6 +694,8 @@ gst_queue_locked_enqueue_event (GstQueue * queue, gpointer item)
/* a new segment allows us to accept more buffers if we got EOS
* from downstream */
queue->unexpected = FALSE;
+ case GST_EVENT_GAP:
+ apply_gap (queue, event, &queue->sink_segment, TRUE);
break;
default:
break;
@@ -727,6 +757,9 @@ gst_queue_locked_dequeue (GstQueue * queue)
queue->newseg_applied_to_src = FALSE;
}
break;
+ case GST_EVENT_GAP:
+ apply_gap (queue, event, &queue->src_segment, FALSE);
+ break;
default:
break;
}