mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-03 04:52:28 +00:00
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:
parent
30ae52d1b9
commit
92064c7169
3 changed files with 34 additions and 5 deletions
18
ChangeLog
18
ChangeLog
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue