mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
downloadbuffer: improve start/stop in buffering query
The start and stop should represent the currently downloading region. The estimated-total should represent the remaining time to download the currently downloading region. This makes it a lot more useful for applications because they can then use those values to update the fill region and use the estimated time to delay playback. Update the docs with this clarification.
This commit is contained in:
parent
557bb0de16
commit
45c61db152
2 changed files with 51 additions and 43 deletions
|
@ -196,19 +196,23 @@ range in a specific format and the estimated time to complete:
|
|||
- the format of the "start" and "stop" values below
|
||||
|
||||
"start", G_TYPE_INT64, -1 unknown
|
||||
- the start position of the available data
|
||||
- the start position of the available data. If there are multiple ranges,
|
||||
this field contains the start position of the currently downloading
|
||||
range.
|
||||
|
||||
"stop", G_TYPE_INT64, -1 unknown
|
||||
- the stop position of the available data
|
||||
- the stop position of the available data. If there are multiple ranges,
|
||||
this field contains the stop position of the currently downloading
|
||||
range.
|
||||
|
||||
"estimated-total", G_TYPE_INT64
|
||||
- gives the estimated download time in milliseconds. -1 unknown.
|
||||
|
||||
When the size of the downloaded file is known, this value will contain
|
||||
the latest estimate of the remaining download time. This value is usually
|
||||
only filled for the "download" buffering mode. The application can use
|
||||
this information to estimate the amount of remaining time to download the
|
||||
complete file.
|
||||
the latest estimate of the remaining download time of the currently
|
||||
downloading range. This value is usually only filled for the "download"
|
||||
buffering mode. The application can use this information to estimate the
|
||||
amount of remaining time to download till the end of the file.
|
||||
|
||||
"buffering-ranges", G_TYPE_ARRAY of GstQueryBufferingRange
|
||||
- contains optionally the downloaded areas in the format given above. One
|
||||
|
|
|
@ -654,6 +654,7 @@ get_seek_threshold (GstDownloadBuffer * dlbuf)
|
|||
return threshold;
|
||||
}
|
||||
|
||||
/* called with DOWNLOAD_BUFFER_MUTEX */
|
||||
static void
|
||||
gst_download_buffer_update_upstream_size (GstDownloadBuffer * dlbuf)
|
||||
{
|
||||
|
@ -736,6 +737,7 @@ out_flushing:
|
|||
}
|
||||
}
|
||||
|
||||
/* called with DOWNLOAD_BUFFER_MUTEX */
|
||||
static gboolean
|
||||
check_upstream_size (GstDownloadBuffer * dlbuf, gsize offset, guint * length)
|
||||
{
|
||||
|
@ -1458,6 +1460,7 @@ gst_download_buffer_handle_src_query (GstPad * pad, GstObject * parent,
|
|||
gint64 duration;
|
||||
gsize offset, range_start, range_stop;
|
||||
|
||||
GST_DOWNLOAD_BUFFER_MUTEX_LOCK (dlbuf);
|
||||
write_pos = dlbuf->write_pos;
|
||||
|
||||
/* get duration of upstream in bytes */
|
||||
|
@ -1467,49 +1470,36 @@ gst_download_buffer_handle_src_query (GstPad * pad, GstObject * parent,
|
|||
GST_DEBUG_OBJECT (dlbuf, "percent %d, duration %" G_GINT64_FORMAT
|
||||
", writing %" G_GINT64_FORMAT, percent, duration, write_pos);
|
||||
|
||||
/* calculate remaining and total download time */
|
||||
if (duration > write_pos && avg_in > 0.0)
|
||||
estimated_total = ((duration - write_pos) * 1000) / avg_in;
|
||||
else
|
||||
estimated_total = -1;
|
||||
|
||||
GST_DEBUG_OBJECT (dlbuf, "estimated-total %" G_GINT64_FORMAT,
|
||||
estimated_total);
|
||||
|
||||
gst_query_parse_buffering_range (query, &format, NULL, NULL, NULL);
|
||||
|
||||
switch (format) {
|
||||
case GST_FORMAT_PERCENT:
|
||||
start = 0;
|
||||
/* get our available data relative to the duration */
|
||||
if (duration != -1)
|
||||
stop =
|
||||
gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX, write_pos,
|
||||
duration);
|
||||
else
|
||||
stop = -1;
|
||||
break;
|
||||
case GST_FORMAT_BYTES:
|
||||
start = 0;
|
||||
stop = write_pos;
|
||||
break;
|
||||
default:
|
||||
start = -1;
|
||||
stop = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
gst_query_set_buffering_range (query, format, start, stop,
|
||||
estimated_total);
|
||||
|
||||
/* fill out the buffered ranges */
|
||||
offset = 0;
|
||||
start = offset = 0;
|
||||
stop = -1;
|
||||
while (gst_sparse_file_get_range_after (dlbuf->file, offset,
|
||||
&range_start, &range_stop)) {
|
||||
gboolean current_range;
|
||||
|
||||
GST_DEBUG_OBJECT (dlbuf,
|
||||
"range starting at %" G_GSIZE_FORMAT " and finishing at %"
|
||||
G_GSIZE_FORMAT, range_start, range_stop);
|
||||
|
||||
offset = range_stop;
|
||||
|
||||
/* find the range we are currently downloading, we'll remember it
|
||||
* after we convert to the target format */
|
||||
if (range_start <= write_pos && range_stop >= write_pos) {
|
||||
current_range = TRUE;
|
||||
/* calculate remaining and total download time */
|
||||
if (duration >= range_stop && avg_in > 0.0)
|
||||
estimated_total = ((duration - range_stop) * 1000) / avg_in;
|
||||
else
|
||||
estimated_total = -1;
|
||||
} else
|
||||
current_range = FALSE;
|
||||
|
||||
switch (format) {
|
||||
case GST_FORMAT_PERCENT:
|
||||
/* get our available data relative to the duration */
|
||||
if (duration == -1) {
|
||||
range_start = 0;
|
||||
range_stop = 0;
|
||||
|
@ -1527,13 +1517,27 @@ gst_download_buffer_handle_src_query (GstPad * pad, GstObject * parent,
|
|||
range_stop = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (current_range) {
|
||||
/* we are currently downloading this range */
|
||||
start = range_start;
|
||||
stop = range_stop;
|
||||
}
|
||||
GST_DEBUG_OBJECT (dlbuf,
|
||||
"range to format: %" G_GSIZE_FORMAT " - %" G_GSIZE_FORMAT,
|
||||
range_start, range_stop);
|
||||
if (range_start == range_stop)
|
||||
continue;
|
||||
GST_DEBUG_OBJECT (dlbuf,
|
||||
"range starting at %" G_GSIZE_FORMAT " and finishing at %"
|
||||
G_GSIZE_FORMAT, range_start, range_stop);
|
||||
gst_query_add_buffering_range (query, range_start, range_stop);
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (dlbuf, "estimated-total %" G_GINT64_FORMAT,
|
||||
estimated_total);
|
||||
|
||||
gst_query_set_buffering_range (query, format, start, stop,
|
||||
estimated_total);
|
||||
|
||||
GST_DOWNLOAD_BUFFER_MUTEX_UNLOCK (dlbuf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue