aboutsummaryrefslogtreecommitdiff
path: root/plugins/elements/gstqueue2.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/elements/gstqueue2.c')
-rw-r--r--plugins/elements/gstqueue2.c186
1 files changed, 96 insertions, 90 deletions
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index 158da10..13e9d22 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -46,10 +46,8 @@
* By using this, it will buffer the entire stream data on the file independently
* of the queue size limits, they will only be used for buffering statistics.
*
- * Since 0.10.24, setting the temp-location property with a filename is deprecated
- * because it's impossible to securely open a temporary file in this way. The
- * property will still be used to notify the application of the allocated
- * filename, though.
+ * The temp-location property will be used to notify the application of the
+ * allocated filename.
*
* Last reviewed on 2009-07-10 (0.10.24)
*/
@@ -98,7 +96,7 @@ enum
/* other defines */
#define DEFAULT_BUFFER_SIZE 4096
-#define QUEUE_IS_USING_TEMP_FILE(queue) ((queue)->temp_location_set || (queue)->temp_template != NULL)
+#define QUEUE_IS_USING_TEMP_FILE(queue) ((queue)->temp_template != NULL)
#define QUEUE_IS_USING_RING_BUFFER(queue) ((queue)->ring_buffer_max_size != 0) /* for consistency with the above macro */
#define QUEUE_IS_USING_QUEUE(queue) (!QUEUE_IS_USING_TEMP_FILE(queue) && !QUEUE_IS_USING_RING_BUFFER (queue))
@@ -334,16 +332,14 @@ gst_queue2_class_init (GstQueue2Class * klass)
g_object_class_install_property (gobject_class, PROP_TEMP_LOCATION,
g_param_spec_string ("temp-location", "Temporary File Location",
- "Location to store temporary files in (Deprecated: Only read this "
- "property, use temp-template to configure the name template)",
- NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ "Location to store temporary files in (Only read this property, "
+ "use temp-template to configure the name template)",
+ NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* GstQueue2:temp-remove
*
* When temp-template is set, remove the temporary file when going to READY.
- *
- * Since: 0.10.26
*/
g_object_class_install_property (gobject_class, PROP_TEMP_REMOVE,
g_param_spec_boolean ("temp-remove", "Remove the Temporary File",
@@ -355,8 +351,6 @@ gst_queue2_class_init (GstQueue2Class * klass)
*
* The maximum size of the ring buffer in bytes. If set to 0, the ring
* buffer is disabled. Default 0.
- *
- * Since: 0.10.31
*/
g_object_class_install_property (gobject_class, PROP_RING_BUFFER_MAX_SIZE,
g_param_spec_uint64 ("ring-buffer-max-size",
@@ -451,7 +445,6 @@ gst_queue2_init (GstQueue2 * queue)
/* tempfile related */
queue->temp_template = NULL;
queue->temp_location = NULL;
- queue->temp_location_set = FALSE;
queue->temp_remove = DEFAULT_TEMP_REMOVE;
queue->ring_buffer = NULL;
@@ -786,7 +779,6 @@ update_buffering (GstQueue2 * queue)
GST_LOG_OBJECT (queue, "we are EOS");
} else {
/* figure out the percent we are filled, we take the max of all formats. */
-
if (!QUEUE_IS_USING_RING_BUFFER (queue)) {
percent = GET_PERCENT (bytes, 0);
} else {
@@ -817,8 +809,6 @@ update_buffering (GstQueue2 * queue)
}
if (post) {
GstMessage *message;
- GstBufferingMode mode;
- gint64 buffering_left = -1;
/* scale to high percent so that it becomes the 100% mark */
percent = percent * 100 / queue->high_percent;
@@ -826,31 +816,34 @@ update_buffering (GstQueue2 * queue)
if (percent > 100)
percent = 100;
+
if (percent != queue->buffering_percent) {
+ GstBufferingMode mode;
+ gint64 buffering_left;
+
+ buffering_left = (percent == 100 ? 0 : -1);
+
queue->buffering_percent = percent;
if (!QUEUE_IS_USING_QUEUE (queue)) {
- gint64 duration;
-
if (QUEUE_IS_USING_RING_BUFFER (queue))
mode = GST_BUFFERING_TIMESHIFT;
else
mode = GST_BUFFERING_DOWNLOAD;
-
- if (queue->byte_in_rate > 0) {
- if (gst_pad_peer_query_duration (queue->sinkpad, GST_FORMAT_BYTES,
- &duration)) {
- buffering_left =
- (gdouble) ((duration -
- queue->current->writing_pos) * 1000) / queue->byte_in_rate;
- }
- } else {
- buffering_left = G_MAXINT64;
- }
} else {
mode = GST_BUFFERING_STREAM;
}
+ if (queue->use_rate_estimate) {
+ guint64 max, cur;
+
+ max = queue->max_level.rate_time;
+ cur = queue->cur_level.rate_time;
+
+ if (percent != 100 && max > cur)
+ buffering_left = (max - cur) / 1000000;
+ }
+
GST_DEBUG_OBJECT (queue, "buffering %d percent", (gint) percent);
message = gst_message_new_buffering (GST_OBJECT_CAST (queue),
(gint) percent);
@@ -1374,45 +1367,34 @@ gst_queue2_open_temp_location_file (GstQueue2 * queue)
GST_DEBUG_OBJECT (queue, "opening temp file %s", queue->temp_template);
- /* we have two cases:
- * - temp_location was set to something !NULL (Deprecated). in this case we
- * open the specified filename.
- * - temp_template was set, allocate a filename and open that filename
- */
- if (!queue->temp_location_set) {
- /* nothing to do */
- if (queue->temp_template == NULL)
- goto no_directory;
-
- /* make copy of the template, we don't want to change this */
- name = g_strdup (queue->temp_template);
- fd = g_mkstemp (name);
- if (fd == -1)
- goto mkstemp_failed;
-
- /* open the file for update/writing */
- queue->temp_file = fdopen (fd, "wb+");
- /* error creating file */
- if (queue->temp_file == NULL)
- goto open_failed;
-
- g_free (queue->temp_location);
- queue->temp_location = name;
+ /* If temp_template was set, allocate a filename and open that filen */
- GST_QUEUE2_MUTEX_UNLOCK (queue);
+ /* nothing to do */
+ if (queue->temp_template == NULL)
+ goto no_directory;
+
+ /* make copy of the template, we don't want to change this */
+ name = g_strdup (queue->temp_template);
+ fd = g_mkstemp (name);
+ if (fd == -1)
+ goto mkstemp_failed;
+
+ /* open the file for update/writing */
+ queue->temp_file = fdopen (fd, "wb+");
+ /* error creating file */
+ if (queue->temp_file == NULL)
+ goto open_failed;
- /* we can't emit the notify with the lock */
- g_object_notify (G_OBJECT (queue), "temp-location");
+ g_free (queue->temp_location);
+ queue->temp_location = name;
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* we can't emit the notify with the lock */
+ g_object_notify (G_OBJECT (queue), "temp-location");
+
+ GST_QUEUE2_MUTEX_LOCK (queue);
- GST_QUEUE2_MUTEX_LOCK (queue);
- } else {
- /* open the file for update/writing, this is deprecated but we still need to
- * support it for API/ABI compatibility */
- queue->temp_file = g_fopen (queue->temp_location, "wb+");
- /* error creating file */
- if (queue->temp_file == NULL)
- goto open_failed;
- }
GST_DEBUG_OBJECT (queue, "opened temp file %s", queue->temp_template);
return TRUE;
@@ -1941,6 +1923,19 @@ gst_queue2_locked_enqueue (GstQueue2 * queue, gpointer item,
item = NULL;
}
break;
+ case GST_EVENT_CAPS:{
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ GST_INFO ("got caps: %" GST_PTR_FORMAT, caps);
+
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ GST_LOG ("Dropping caps event, not using queue");
+ gst_event_unref (event);
+ item = NULL;
+ }
+ break;
+ }
default:
if (!QUEUE_IS_USING_QUEUE (queue))
goto unexpected_event;
@@ -2139,7 +2134,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
/* reset rate counters */
reset_rate_timer (queue);
gst_pad_start_task (queue->srcpad, (GstTaskFunction) gst_queue2_loop,
- queue->srcpad);
+ queue->srcpad, NULL);
GST_QUEUE2_MUTEX_UNLOCK (queue);
} else {
GST_QUEUE2_MUTEX_LOCK (queue);
@@ -2697,16 +2692,31 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
GST_FORMAT_BYTES, &duration);
}
+ GST_DEBUG_OBJECT (queue, "percent %d, duration %" G_GINT64_FORMAT
+ ", writing %" G_GINT64_FORMAT, percent, duration, writing_pos);
+
/* calculate remaining and total download time */
- if (peer_res && byte_in_rate > 0.0) {
- estimated_total = (duration * 1000) / byte_in_rate;
- buffering_left = ((duration - writing_pos) * 1000) / byte_in_rate;
- } else {
+ if (peer_res && byte_in_rate > 0.0)
+ estimated_total = ((duration - writing_pos) * 1000) / byte_in_rate;
+ else
estimated_total = -1;
- buffering_left = -1;
+
+ /* calculate estimated remaining buffer time */
+ buffering_left = (percent == 100 ? 0 : -1);
+
+ if (queue->use_rate_estimate) {
+ guint64 max, cur;
+
+ max = queue->max_level.rate_time;
+ cur = queue->cur_level.rate_time;
+
+ if (percent != 100 && max > cur)
+ buffering_left = (max - cur) / 1000000;
}
- GST_DEBUG_OBJECT (queue, "estimated %" G_GINT64_FORMAT ", left %"
- G_GINT64_FORMAT, estimated_total, buffering_left);
+
+ GST_DEBUG_OBJECT (queue, "estimated-total %" G_GINT64_FORMAT
+ ", buffering-left %" G_GINT64_FORMAT, estimated_total,
+ buffering_left);
gst_query_parse_buffering_range (query, &format, NULL, NULL, NULL);
@@ -2716,14 +2726,12 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
if (!peer_res)
goto peer_failed;
- GST_DEBUG_OBJECT (queue,
- "duration %" G_GINT64_FORMAT ", writing %" G_GINT64_FORMAT,
- duration, writing_pos);
-
start = 0;
/* get our available data relative to the duration */
if (duration != -1)
- stop = GST_FORMAT_PERCENT_MAX * writing_pos / duration;
+ stop =
+ gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX, writing_pos,
+ duration);
else
stop = -1;
break;
@@ -2747,8 +2755,12 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
range_stop = 0;
break;
}
- range_start = 100 * queued_ranges->offset / duration;
- range_stop = 100 * queued_ranges->writing_pos / duration;
+ range_start =
+ gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX,
+ queued_ranges->offset, duration);
+ range_stop =
+ gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX,
+ queued_ranges->writing_pos, duration);
break;
case GST_FORMAT_BYTES:
range_start = queued_ranges->offset;
@@ -2768,10 +2780,10 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
}
gst_query_set_buffering_percent (query, is_buffering, percent);
- gst_query_set_buffering_range (query, format, start, stop,
- estimated_total);
gst_query_set_buffering_stats (query, GST_BUFFERING_DOWNLOAD,
byte_in_rate, byte_out_rate, buffering_left);
+ gst_query_set_buffering_range (query, format, start, stop,
+ estimated_total);
}
break;
}
@@ -2944,7 +2956,8 @@ gst_queue2_src_activate_push (GstPad * pad, GstObject * parent, gboolean active)
queue->sinkresult = GST_FLOW_OK;
queue->is_eos = FALSE;
queue->unexpected = FALSE;
- result = gst_pad_start_task (pad, (GstTaskFunction) gst_queue2_loop, pad);
+ result =
+ gst_pad_start_task (pad, (GstTaskFunction) gst_queue2_loop, pad, NULL);
GST_QUEUE2_MUTEX_UNLOCK (queue);
} else {
/* unblock loop function */
@@ -3192,13 +3205,6 @@ gst_queue2_set_property (GObject * object,
case PROP_TEMP_TEMPLATE:
gst_queue2_set_temp_template (queue, g_value_get_string (value));
break;
- case PROP_TEMP_LOCATION:
- g_free (queue->temp_location);
- queue->temp_location = g_value_dup_string (value);
- /* you can set the property back to NULL to make it use the temp-template
- * property. */
- queue->temp_location_set = queue->temp_location != NULL;
- break;
case PROP_TEMP_REMOVE:
queue->temp_remove = g_value_get_boolean (value);
break;