+2006-03-29 Wim Taymans <wim@fluendo.com>
+
+ Patch by Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_locked_flush), (gst_queue_handle_sink_event),
+ (gst_queue_set_property):
+ * plugins/elements/gstqueue.h:
+ In queue, when EOS is received, if minimum threshold > max_size -
+ current_level, there is chance that queue blocks forever in conditional item
+ del wait. This is because the queue is not emptied completely due to minimum
+ threshold.
+ Here is another approach. Instead of setting cur_levels to max in EOS, just
+ zero all minimum threshold levels. This should make sure that queue gives out
+ all data. When going to READY (stop) state, just reset the original minimum
+ threshold levels.
+ Fixes #336336.
+
2006-03-29 Tim-Philipp Müller <tim at centricular dot net>
* plugins/elements/gsttypefindelement.c: (stop_typefinding),
queue->min_threshold.buffers = 0; /* no threshold */
queue->min_threshold.bytes = 0; /* no threshold */
queue->min_threshold.time = 0; /* no threshold */
+ queue->orig_min_threshold.buffers = 0;
+ queue->orig_min_threshold.bytes = 0;
+ queue->orig_min_threshold.time = 0;
queue->leaky = GST_QUEUE_NO_LEAK;
queue->srcresult = GST_FLOW_WRONG_STATE;
queue->cur_level.buffers = 0;
queue->cur_level.bytes = 0;
queue->cur_level.time = 0;
+ queue->min_threshold.buffers = queue->orig_min_threshold.buffers;
+ queue->min_threshold.bytes = queue->orig_min_threshold.bytes;
+ queue->min_threshold.time = queue->orig_min_threshold.time;
/* we deleted something... */
g_cond_signal (queue->item_del);
GST_QUEUE_MUTEX_LOCK (queue);
if (have_eos) {
- /* FIXME, abusing the cur_level */
- queue->cur_level.buffers = queue->max_size.buffers;
- queue->cur_level.bytes = queue->max_size.bytes;
- queue->cur_level.time = queue->max_size.time;
+ /* Zero the thresholds, this makes sure the queue is completely
+ * filled and we can read all data from the queue. */
+ queue->min_threshold.buffers = 0;
+ queue->min_threshold.bytes = 0;
+ queue->min_threshold.time = 0;
}
g_queue_push_tail (queue->queue, event);
g_cond_signal (queue->item_add);
break;
case ARG_MIN_THRESHOLD_BYTES:
queue->min_threshold.bytes = g_value_get_uint (value);
+ queue->orig_min_threshold.bytes = queue->min_threshold.bytes;
break;
case ARG_MIN_THRESHOLD_BUFFERS:
queue->min_threshold.buffers = g_value_get_uint (value);
+ queue->orig_min_threshold.buffers = queue->min_threshold.buffers;
break;
case ARG_MIN_THRESHOLD_TIME:
queue->min_threshold.time = g_value_get_uint64 (value);
+ queue->orig_min_threshold.time = queue->min_threshold.time;
break;
case ARG_LEAKY:
queue->leaky = g_value_get_enum (value);
GstQueueSize
cur_level, /* currently in the queue */
max_size, /* max. amount of data allowed in the queue */
- min_threshold; /* min. amount of data required to wake reader */
+ min_threshold, /* min. amount of data required to wake reader */
+ orig_min_threshold; /* Original min.threshold, for reset in EOS */
/* whether we leak data, and at which end */
gint leaky;