diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-10-02 11:00:32 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-10-14 09:39:05 +0200 |
commit | 47c5d48e5899320a2f4258884e152690708ce13a (patch) | |
tree | f6926dcd405d890ee3b49c62204434051b7e38e2 /plugins | |
parent | 18a5f7ba9837a9aa189baaf578f142054b3268a7 (diff) | |
download | gstreamer-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.c | 33 |
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, ×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 (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; } |