GNOME Bugzilla – Bug 430682
multiqueue doesn't output data on unlinked pads properly
Last modified: 2007-06-27 11:42:41 UTC
Discovered the multiple unlinked pads can confuse multiqueue into not waking some of them up to deliver packets. Attaching patch and test because I'd like bilboed to review it before committing.
Created attachment 86502 [details] [review] patch This patch makes multiqueue recalculate the next_non_linked pad differently so that all non-linked pads get woken up in turn to deliver their data. It also makes it so that all pads are considered not-linked by default. That way, data on them is held until preceding not-linked data is output, rather than having them immediately output data, which ends up being in the wrong order if the new pad turns out to be not-linked.
Actually, this patch still isn't quite right - it doesn't wake up not-linked pads correctly when they drain and get new data. (I'm pretty sure it's no worse than the old method in that respect though - it just wasn't as obvious there because pads weren't treated as initially not-linked)
Fixed in CVS: 2007-06-26 Jan Schmidt <thaytan@noraisin.net> * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_single_queue_flush), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_loop), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_src_activate_push), (wake_up_next_non_linked), (compute_high_id), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: Take the multiqueue lock when updating the fill level so we don't get confused. After applying a buffer or event on the src pad segment, make sure to call gst_data_queue_limits_changed() to get the data queue to unblock and check the filled state again. Rework the not-linked pad handling so the logic is that not-linked pads can push as fast as they like, but only so they never get ahead of any linked pads. * tests/check/elements/multiqueue.c: (mq_sinkpad_to_srcpad), (mq_dummypad_getcaps), (mq_dummypad_chain), (mq_dummypad_event), (run_output_order_test), (GST_START_TEST), (multiqueue_suite): Add a test to check that not-linked pads always stay behind linked pads. Fixes: #430682