summaryrefslogtreecommitdiff
path: root/plugins/elements
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2016-01-06 19:50:21 +0000
committerTim-Philipp Müller <tim@centricular.com>2016-01-06 20:00:46 +0000
commit8c6c0bef884197808745e0fc9e9aa814b826a437 (patch)
tree857331a733e2f8a3fe38c8605a6d4e6628b6920d /plugins/elements
parent5e40639be7a3b8b809d216d49a79012dbf1dc37d (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
Diffstat (limited to 'plugins/elements')
-rw-r--r--plugins/elements/gstqueue2.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index 167eaf4c72..9b37d66ab9 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -862,6 +862,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)
@@ -875,7 +891,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