diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-10-02 10:57:43 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-10-14 09:38:53 +0200 |
commit | 18a5f7ba9837a9aa189baaf578f142054b3268a7 (patch) | |
tree | d926a31b83b14b6bbadb96092c1d4936450f0d65 | |
parent | 3ce1a41144beeee9e8e1840fea8b1d94b388614f (diff) | |
download | gstreamer-18a5f7ba9837a9aa189baaf578f142054b3268a7.tar.gz |
queue2: update segment position on GAP events to calculate levels properly
https://bugzilla.gnome.org/show_bug.cgi?id=737498
-rw-r--r-- | plugins/elements/gstqueue2.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index fcaf7bed50..87f9a5fcca 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -712,6 +712,33 @@ apply_segment (GstQueue2 * queue, GstEvent * event, GstSegment * segment, update_time_level (queue); } +static void +apply_gap (GstQueue2 * queue, GstEvent * event, + GstSegment * segment, gboolean is_sink) +{ + GstClockTime timestamp; + GstClockTime duration; + + gst_event_parse_gap (event, ×tamp, &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 (GstQueue2 * queue, GstBuffer * buffer, GstSegment * segment, @@ -2042,6 +2069,9 @@ gst_queue2_locked_enqueue (GstQueue2 * queue, gpointer item, * from downstream */ queue->unexpected = FALSE; break; + case GST_EVENT_GAP: + apply_gap (queue, event, &queue->sink_segment, TRUE); + break; case GST_EVENT_STREAM_START: if (!QUEUE_IS_USING_QUEUE (queue)) { gst_event_replace (&queue->stream_start_event, event); @@ -2170,6 +2200,9 @@ gst_queue2_locked_dequeue (GstQueue2 * queue, GstQueue2ItemType * item_type) case GST_EVENT_SEGMENT: apply_segment (queue, event, &queue->src_segment, FALSE); break; + case GST_EVENT_GAP: + apply_gap (queue, event, &queue->src_segment, FALSE); + break; default: break; } |