diff options
author | Jan Schmidt <jan@centricular.com> | 2016-11-15 14:39:43 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-11-24 14:37:57 +0300 |
commit | f8775abcae914f0ca301495b14afd667b800929e (patch) | |
tree | a3d0922cc5fbedde59d615f55e4c54b79021df32 | |
parent | 77566f9151d2f459697fcfba49dbb2575eca9632 (diff) |
queues: Don't return negative position queries.
When subtracting queued data sizes from upstream queries
in queue, queue2, downloadbuffer and typefind, clamp the
result to not go negative, in case upstream returned
a nonsense value that's too small (as could happen if
upstream is estimating, or just broken)
-rw-r--r-- | plugins/elements/gstdownloadbuffer.c | 4 | ||||
-rw-r--r-- | plugins/elements/gstqueue.c | 4 | ||||
-rw-r--r-- | plugins/elements/gstqueue2.c | 4 | ||||
-rw-r--r-- | plugins/elements/gsttypefindelement.c | 2 |
4 files changed, 14 insertions, 0 deletions
diff --git a/plugins/elements/gstdownloadbuffer.c b/plugins/elements/gstdownloadbuffer.c index 79ea1492bd..9551d9beac 100644 --- a/plugins/elements/gstdownloadbuffer.c +++ b/plugins/elements/gstdownloadbuffer.c @@ -1434,9 +1434,13 @@ gst_download_buffer_handle_src_query (GstPad * pad, GstObject * parent, switch (format) { case GST_FORMAT_BYTES: peer_pos -= dlbuf->cur_level.bytes; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; case GST_FORMAT_TIME: peer_pos -= dlbuf->cur_level.time; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; default: GST_WARNING_OBJECT (dlbuf, "dropping query in %s format, don't " diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index e8f7f89767..c3176b9717 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -1606,9 +1606,13 @@ gst_queue_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query) switch (format) { case GST_FORMAT_BYTES: peer_pos -= queue->cur_level.bytes; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; case GST_FORMAT_TIME: peer_pos -= queue->cur_level.time; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; default: GST_DEBUG_OBJECT (queue, "Can't adjust query in %s format, don't " diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index c4d86116d3..478a107ead 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -3155,9 +3155,13 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query) switch (format) { case GST_FORMAT_BYTES: peer_pos -= queue->cur_level.bytes; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; case GST_FORMAT_TIME: peer_pos -= queue->cur_level.time; + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; default: GST_WARNING_OBJECT (queue, "dropping query in %s format, don't " diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index 0740972aca..a63dca7b47 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -450,6 +450,8 @@ gst_type_find_handle_src_query (GstPad * pad, GstObject * parent, switch (format) { case GST_FORMAT_BYTES: peer_pos -= gst_adapter_available (typefind->adapter); + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; default: /* FIXME */ |