diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2016-01-06 22:50:21 +0300 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2016-01-12 01:00:18 +0300 |
commit | 6b5decf0e68a2f69c308d1703ac3a42c6fe51e8b (patch) | |
tree | 5714614476d83dbdc9f8d08a6f1256819ff1a9e4 | |
parent | ccec9e6b90a41c724db86ee2cab3f96e319187c2 (diff) |
queue2: fix fill level arithmetic overflow with large values
Based on patch by: Aleksander Wabik <awabik@opera.com>
https://bugzilla.gnome.org/show_bug.cgi?id=755971
-rw-r--r-- | plugins/elements/gstqueue2.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 9dbf26c408..4fbc0e4ad1 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -830,6 +830,22 @@ apply_buffer_list (GstQueue2 * queue, GstBufferList * buffer_list, update_time_level (queue); } +static inline gint +get_percent (guint64 cur_level, guint64 max_level, guint64 alt_max) +{ + guint64 p; + + if (max_level == 0) + return 0; + + if (alt_max > 0) + p = gst_util_uint64_scale (cur_level, 100, MIN (max_level, alt_max)); + else + p = gst_util_uint64_scale (cur_level, 100, max_level); + + return MIN (p, 100); +} + static gboolean get_buffering_percent (GstQueue2 * queue, gboolean * is_buffering, gint * percent) @@ -843,7 +859,8 @@ get_buffering_percent (GstQueue2 * queue, gboolean * is_buffering, *is_buffering = FALSE; return FALSE; } -#define GET_PERCENT(format,alt_max) ((queue->max_level.format) > 0 ? (queue->cur_level.format) * 100 / ((alt_max) > 0 ? MIN ((alt_max), (queue->max_level.format)) : (queue->max_level.format)) : 0) +#define GET_PERCENT(format,alt_max) \ + get_percent(queue->cur_level.format,queue->max_level.format,(alt_max)) if (queue->is_eos) { /* on EOS we are always 100% full, we set the var here so that it we can |