plugins/elements/gstqueue.*: In queue, when EOS is received, if minimum threshold > max_size - current_level, there i...

Original commit message from CVS:
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.
This commit is contained in:
Tommi Myöhänen 2006-03-29 11:02:33 +00:00 committed by Wim Taymans
parent 30ae52d1b9
commit 92064c7169
3 changed files with 34 additions and 5 deletions

View file

@ -1,3 +1,21 @@
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),

View file

@ -374,6 +374,9 @@ gst_queue_init (GstQueue * queue)
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;
@ -494,6 +497,9 @@ gst_queue_locked_flush (GstQueue * queue)
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);
@ -562,10 +568,11 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
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);
@ -1060,12 +1067,15 @@ gst_queue_set_property (GObject * object,
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);

View file

@ -84,7 +84,8 @@ struct _GstQueue {
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;