Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/gstreamer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2016-01-06 22:50:21 +0300
committerTim-Philipp Müller <tim@centricular.com>2016-01-12 01:00:18 +0300
commit6b5decf0e68a2f69c308d1703ac3a42c6fe51e8b (patch)
tree5714614476d83dbdc9f8d08a6f1256819ff1a9e4
parentccec9e6b90a41c724db86ee2cab3f96e319187c2 (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.c19
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