summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Normand <pnormand@igalia.com>2010-08-31 11:37:42 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-09-03 19:59:28 +0200
commit410ca5c164d308a8f18758c6dbb86336aa7b335d (patch)
tree5df7a2692220e19b6221d99b5881d4a085c5f0be
parent36e1ad94e1775e866cd207c3b7260814d53178d2 (diff)
queue2: buffering_ranges query support
Fixes bug 623121
-rw-r--r--plugins/elements/gstqueue2.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index bb09e5a0a..f8c8b9999 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -2444,7 +2444,7 @@ gst_queue2_handle_src_query (GstPad * pad, GstQuery * query)
goto peer_failed;
GST_DEBUG_OBJECT (queue, "buffering forwarded to peer");
} else {
- gint64 start, stop;
+ gint64 start, stop, range_start, range_stop;
guint64 writing_pos;
gint percent;
gint64 estimated_total, buffering_left;
@@ -2452,6 +2452,7 @@ gst_queue2_handle_src_query (GstPad * pad, GstQuery * query)
gint64 duration;
gboolean peer_res, is_buffering, is_eos;
gdouble byte_in_rate, byte_out_rate;
+ GstQueue2Range *queued_ranges;
/* we need a current download region */
if (queue->current == NULL)
@@ -2514,6 +2515,37 @@ gst_queue2_handle_src_query (GstPad * pad, GstQuery * query)
stop = -1;
break;
}
+
+ /* fill out the buffered ranges */
+ for (queued_ranges = queue->ranges; queued_ranges;
+ queued_ranges = queued_ranges->next) {
+ switch (format) {
+ case GST_FORMAT_PERCENT:
+ if (duration == -1) {
+ range_start = 0;
+ range_stop = 0;
+ break;
+ }
+ range_start = 100 * queued_ranges->offset / duration;
+ range_stop = 100 * queued_ranges->writing_pos / duration;
+ break;
+ case GST_FORMAT_BYTES:
+ range_start = queued_ranges->offset;
+ range_stop = queued_ranges->writing_pos;
+ break;
+ default:
+ range_start = -1;
+ range_stop = -1;
+ break;
+ }
+ if (range_start == range_stop)
+ continue;
+ GST_DEBUG_OBJECT (queue,
+ "range starting at %" G_GINT64_FORMAT " and finishing at %"
+ G_GINT64_FORMAT, range_start, range_stop);
+ gst_query_add_buffering_range (query, range_start, range_stop);
+ }
+
gst_query_set_buffering_percent (query, is_buffering, percent);
gst_query_set_buffering_range (query, format, start, stop,
estimated_total);
@@ -2683,7 +2715,7 @@ gst_queue2_src_activate_pull (GstPad * pad, gboolean active)
result = gst_queue2_open_temp_location_file (queue);
} else if (!queue->ring_buffer) {
queue->ring_buffer = g_malloc (queue->ring_buffer_max_size);
- result = ! !queue->ring_buffer;
+ result = !!queue->ring_buffer;
} else {
result = TRUE;
}
@@ -2886,7 +2918,7 @@ gst_queue2_set_property (GObject * object,
break;
case PROP_RING_BUFFER_MAX_SIZE:
queue->ring_buffer_max_size = g_value_get_uint64 (value);
- queue->use_ring_buffer = ! !queue->ring_buffer_max_size;
+ queue->use_ring_buffer = !!queue->ring_buffer_max_size;
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);