diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2011-02-10 14:50:04 +0100 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2011-02-10 15:21:46 +0100 |
commit | d19f40c7169db209fd71b06d3d2f9c209aacfe5e (patch) | |
tree | 38370d8916f0ec78f725f87d1d259097820205d1 | |
parent | dad43fa0042bbdbb0e91e17a7735e9527c898fe5 (diff) |
basesink: keep track of earliest QoS timestamp
Keep track of the earliest allowed timestamp according to the latest
QoS report and drop buffers before that time. Activate this filter
when throttling is enabled. We could later also activate this in the
other QoS cases.
See #638891
-rw-r--r-- | libs/gst/base/gstbasesink.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 498b0e9600..046fd11e68 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c | |||
@@ -260,7 +260,8 @@ struct _GstBaseSinkPrivate | |||
260 | /* Cached GstClockID */ | 260 | /* Cached GstClockID */ |
261 | GstClockID cached_clock_id; | 261 | GstClockID cached_clock_id; |
262 | 262 | ||
263 | /* for throttling */ | 263 | /* for throttling and QoS */ |
264 | GstClockTime earliest_in_time; | ||
264 | GstClockTime throttle_time; | 265 | GstClockTime throttle_time; |
265 | }; | 266 | }; |
266 | 267 | ||
@@ -2490,6 +2491,10 @@ do_step: | |||
2490 | /* save sync time for eos when the previous object needed sync */ | 2491 | /* save sync time for eos when the previous object needed sync */ |
2491 | priv->eos_rtime = (do_sync ? priv->current_rstop : GST_CLOCK_TIME_NONE); | 2492 | priv->eos_rtime = (do_sync ? priv->current_rstop : GST_CLOCK_TIME_NONE); |
2492 | 2493 | ||
2494 | if (G_UNLIKELY (priv->earliest_in_time != -1 | ||
2495 | && rstart < priv->earliest_in_time)) | ||
2496 | goto qos_dropped; | ||
2497 | |||
2493 | again: | 2498 | again: |
2494 | /* first do preroll, this makes sure we commit our state | 2499 | /* first do preroll, this makes sure we commit our state |
2495 | * to PAUSED and can continue to PLAYING. We cannot perform | 2500 | * to PAUSED and can continue to PLAYING. We cannot perform |
@@ -2576,6 +2581,12 @@ not_syncable: | |||
2576 | GST_DEBUG_OBJECT (basesink, "non syncable object %p", obj); | 2581 | GST_DEBUG_OBJECT (basesink, "non syncable object %p", obj); |
2577 | return GST_FLOW_OK; | 2582 | return GST_FLOW_OK; |
2578 | } | 2583 | } |
2584 | qos_dropped: | ||
2585 | { | ||
2586 | GST_DEBUG_OBJECT (basesink, "dropped because of QoS %p", obj); | ||
2587 | *late = TRUE; | ||
2588 | return GST_FLOW_OK; | ||
2589 | } | ||
2579 | flushing: | 2590 | flushing: |
2580 | { | 2591 | { |
2581 | GST_DEBUG_OBJECT (basesink, "we are flushing"); | 2592 | GST_DEBUG_OBJECT (basesink, "we are flushing"); |
@@ -2754,6 +2765,7 @@ gst_base_sink_reset_qos (GstBaseSink * sink) | |||
2754 | priv = sink->priv; | 2765 | priv = sink->priv; |
2755 | 2766 | ||
2756 | priv->last_in_time = GST_CLOCK_TIME_NONE; | 2767 | priv->last_in_time = GST_CLOCK_TIME_NONE; |
2768 | priv->earliest_in_time = GST_CLOCK_TIME_NONE; | ||
2757 | priv->last_left = GST_CLOCK_TIME_NONE; | 2769 | priv->last_left = GST_CLOCK_TIME_NONE; |
2758 | priv->avg_duration = GST_CLOCK_TIME_NONE; | 2770 | priv->avg_duration = GST_CLOCK_TIME_NONE; |
2759 | priv->avg_pt = GST_CLOCK_TIME_NONE; | 2771 | priv->avg_pt = GST_CLOCK_TIME_NONE; |
@@ -2833,6 +2845,9 @@ gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj, | |||
2833 | done: | 2845 | done: |
2834 | if (!late || !GST_CLOCK_TIME_IS_VALID (priv->last_in_time)) { | 2846 | if (!late || !GST_CLOCK_TIME_IS_VALID (priv->last_in_time)) { |
2835 | priv->last_in_time = start; | 2847 | priv->last_in_time = start; |
2848 | /* the next allowed input timestamp */ | ||
2849 | if (priv->throttle_time > 0) | ||
2850 | priv->earliest_in_time = start + priv->throttle_time; | ||
2836 | } | 2851 | } |
2837 | return late; | 2852 | return late; |
2838 | 2853 | ||