After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 430682 - multiqueue doesn't output data on unlinked pads properly
multiqueue doesn't output data on unlinked pads properly
Status: RESOLVED FIXED
Product: GStreamer
Classification: Platform
Component: gstreamer (core)
git master
Other Linux
: Normal normal
: 0.10.14
Assigned To: Jan Schmidt
GStreamer Maintainers
Depends on:
Blocks:
 
 
Reported: 2007-04-17 14:50 UTC by Jan Schmidt
Modified: 2007-06-27 11:42 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
patch (11.35 KB, patch)
2007-04-17 14:54 UTC, Jan Schmidt
none Details | Review

Description Jan Schmidt 2007-04-17 14:50:33 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.
Comment 1 Jan Schmidt 2007-04-17 14:54:30 UTC
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.
Comment 2 Jan Schmidt 2007-04-17 21:20:23 UTC
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)
Comment 3 Jan Schmidt 2007-06-27 11:42:41 UTC
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