mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 20:25:25 +00:00
audiomixer: Avoid race in caps negotiation
With the current audiomixer, the input caps need to be the same, otherwise there is an unavoidable race in the caps negotiation. So enforce that using capsfilters https://bugzilla.gnome.org/show_bug.cgi?id=742684
This commit is contained in:
parent
eddd5fd259
commit
94e2d78479
1 changed files with 33 additions and 20 deletions
|
@ -587,11 +587,12 @@ test_live_seeking_try_audiosrc (const gchar * factory_name)
|
|||
/* test failing seeks on live-sources */
|
||||
GST_START_TEST (test_live_seeking)
|
||||
{
|
||||
GstElement *bin, *src1 =
|
||||
NULL, *src2, *ac1, *ac2, *q1, *q2, *audiomixer, *sink;
|
||||
GstElement *bin, *src1 = NULL, *cf, *src2, *audiomixer, *sink;
|
||||
GstCaps *caps;
|
||||
GstBus *bus;
|
||||
gboolean res;
|
||||
GstPad *srcpad;
|
||||
GstPad *sinkpad;
|
||||
gint i;
|
||||
GstStateChangeReturn state_res;
|
||||
GstStreamConsistency *consist;
|
||||
|
@ -624,32 +625,44 @@ GST_START_TEST (test_live_seeking)
|
|||
g_object_set (src1, "num-buffers", 4, "blocksize", 44100, NULL);
|
||||
}
|
||||
|
||||
ac1 = gst_element_factory_make ("audioconvert", "ac1");
|
||||
q1 = gst_element_factory_make ("queue", "q1");
|
||||
src2 = gst_element_factory_make ("audiotestsrc", "src2");
|
||||
g_object_set (src2, "wave", 4, NULL); /* silence */
|
||||
ac2 = gst_element_factory_make ("audioconvert", "ac2");
|
||||
q2 = gst_element_factory_make ("queue", "q2");
|
||||
audiomixer = gst_element_factory_make ("audiomixer", "audiomixer");
|
||||
cf = gst_element_factory_make ("capsfilter", "capsfilter");
|
||||
sink = gst_element_factory_make ("fakesink", "sink");
|
||||
gst_bin_add_many (GST_BIN (bin), src1, ac1, q1, src2, ac2, q2, audiomixer,
|
||||
sink, NULL);
|
||||
|
||||
res = gst_element_link (src1, ac1);
|
||||
gst_bin_add_many (GST_BIN (bin), src1, cf, audiomixer, sink, NULL);
|
||||
res = gst_element_link (src1, cf);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (ac1, q1);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (q1, audiomixer);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (src2, ac2);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (ac2, q2);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (q2, audiomixer);
|
||||
res = gst_element_link (cf, audiomixer);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
res = gst_element_link (audiomixer, sink);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
|
||||
gst_element_set_state (bin, GST_STATE_PLAYING);
|
||||
/* wait for completion */
|
||||
state_res =
|
||||
gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
|
||||
GST_CLOCK_TIME_NONE);
|
||||
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
|
||||
|
||||
sinkpad = gst_element_get_static_pad (sink, "sink");
|
||||
fail_unless (sinkpad != NULL);
|
||||
caps = gst_pad_get_current_caps (sinkpad);
|
||||
fail_unless (caps != NULL);
|
||||
gst_object_unref (sinkpad);
|
||||
|
||||
gst_element_set_state (bin, GST_STATE_NULL);
|
||||
|
||||
g_object_set (cf, "caps", caps, NULL);
|
||||
|
||||
src2 = gst_element_factory_make ("audiotestsrc", "src2");
|
||||
g_object_set (src2, "wave", 4, NULL); /* silence */
|
||||
gst_bin_add (GST_BIN (bin), src2);
|
||||
|
||||
res = gst_element_link_filtered (src2, audiomixer, caps);
|
||||
fail_unless (res == TRUE, NULL);
|
||||
|
||||
gst_caps_unref (caps);
|
||||
|
||||
play_seek_event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
|
||||
GST_SEEK_FLAG_FLUSH,
|
||||
GST_SEEK_TYPE_SET, (GstClockTime) 0,
|
||||
|
|
Loading…
Reference in a new issue