multiqueue: handle UNEXPECTED flowreturn better

When we receive an UNEXPECTED flowreturn from downstream, we must not shutdown
the pushing thread because upstream will at some point push an EOS that we still
need to push further downstream.

To achieve this, convert the UNEXPECTED return value to OK. Add a fixme so that
we implement the right logic to propagate the flowreturn upstream at some point.

Also clean up the unit test a little.

Fixes #608136
This commit is contained in:
Wim Taymans 2010-01-26 12:43:09 +01:00
parent 69e23983a4
commit fbdf4dceda
2 changed files with 9 additions and 2 deletions

View file

@ -917,6 +917,13 @@ gst_single_queue_push_one (GstMultiQueue * mq, GstSingleQueue * sq,
gst_pad_set_caps (sq->srcpad, caps); gst_pad_set_caps (sq->srcpad, caps);
result = gst_pad_push (sq->srcpad, buffer); result = gst_pad_push (sq->srcpad, buffer);
if (result == GST_FLOW_UNEXPECTED) {
GST_LOG_OBJECT (mq, "got UNEXPECTED from downstream");
/* FIXME, dequeue items until we see EOS or NEWSEGMENT. If the queue is
* empty, set a flag so that we pass unexpected upstream. */
result = GST_FLOW_OK;
}
} else if (GST_IS_EVENT (object)) { } else if (GST_IS_EVENT (object)) {
GstEvent *event; GstEvent *event;

View file

@ -479,13 +479,13 @@ run_output_order_test (gint n_linked)
/* Wait while the buffers are processed */ /* Wait while the buffers are processed */
g_mutex_lock (mutex); g_mutex_lock (mutex);
while (eos_seen < 5) { while (eos_seen < NPADS) {
g_cond_wait (cond, mutex); g_cond_wait (cond, mutex);
} }
g_mutex_unlock (mutex); g_mutex_unlock (mutex);
/* Clean up */ /* Clean up */
for (i = 0; i < 5; i++) { for (i = 0; i < NPADS; i++) {
GstPad *mq_input = gst_pad_get_peer (inputpads[i]); GstPad *mq_input = gst_pad_get_peer (inputpads[i]);
gst_pad_unlink (inputpads[i], mq_input); gst_pad_unlink (inputpads[i], mq_input);