audiomixer: Replace racy timeout based tested with drain query
Using the drain query, we can be certain that the buffer has done going through the aggregator by taking the stream locks. https://bugzilla.gnome.org/show_bug.cgi?id=742684
This commit is contained in:
parent
402c0d4c5c
commit
0955a39a3d
@ -891,36 +891,17 @@ GST_END_TEST;
|
|||||||
|
|
||||||
|
|
||||||
static GstBuffer *handoff_buffer = NULL;
|
static GstBuffer *handoff_buffer = NULL;
|
||||||
static gboolean
|
|
||||||
_quit (GMainLoop * ml)
|
|
||||||
{
|
|
||||||
g_main_loop_quit (ml);
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handoff_buffer_cb (GstElement * fakesink, GstBuffer * buffer, GstPad * pad,
|
handoff_buffer_cb (GstElement * fakesink, GstBuffer * buffer, GstPad * pad,
|
||||||
GstClockTime * wanted_end)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GST_DEBUG ("got buffer -- SIZE: %" G_GSIZE_FORMAT
|
GST_DEBUG ("got buffer -- SIZE: %" G_GSIZE_FORMAT
|
||||||
" -- %p DURATION is %" GST_TIME_FORMAT " -- WANTED END %" GST_TIME_FORMAT,
|
" -- %p DURATION is %" GST_TIME_FORMAT,
|
||||||
gst_buffer_get_size (buffer), buffer,
|
gst_buffer_get_size (buffer), buffer,
|
||||||
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)),
|
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
||||||
GST_TIME_ARGS (*wanted_end));
|
|
||||||
|
|
||||||
gst_buffer_replace (&handoff_buffer, buffer);
|
gst_buffer_replace (&handoff_buffer, buffer);
|
||||||
|
|
||||||
|
|
||||||
/* Buffers we push in will be 'cut' into different smaller buffers,
|
|
||||||
* we make sure that the last chunck was pushes before we concider the buffer
|
|
||||||
* we pushed as being done */
|
|
||||||
if (main_loop && *wanted_end
|
|
||||||
&& *wanted_end <=
|
|
||||||
GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)) {
|
|
||||||
*wanted_end = 0;
|
|
||||||
g_idle_add ((GSourceFunc) _quit, main_loop);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if clipping works as expected */
|
/* check if clipping works as expected */
|
||||||
@ -936,14 +917,10 @@ GST_START_TEST (test_clip)
|
|||||||
GstEvent *event;
|
GstEvent *event;
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GMainLoop *local_mainloop;
|
GstQuery *drain = gst_query_new_drain ();
|
||||||
GstClockTime wanted_end = 0;
|
|
||||||
|
|
||||||
GST_INFO ("preparing test");
|
GST_INFO ("preparing test");
|
||||||
|
|
||||||
local_mainloop = g_main_loop_new (NULL, FALSE);
|
|
||||||
main_loop = NULL;
|
|
||||||
|
|
||||||
/* build pipeline */
|
/* build pipeline */
|
||||||
bin = gst_pipeline_new ("pipeline");
|
bin = gst_pipeline_new ("pipeline");
|
||||||
bus = gst_element_get_bus (bin);
|
bus = gst_element_get_bus (bin);
|
||||||
@ -957,8 +934,7 @@ GST_START_TEST (test_clip)
|
|||||||
audiomixer = gst_element_factory_make ("audiomixer", "audiomixer");
|
audiomixer = gst_element_factory_make ("audiomixer", "audiomixer");
|
||||||
sink = gst_element_factory_make ("fakesink", "sink");
|
sink = gst_element_factory_make ("fakesink", "sink");
|
||||||
g_object_set (sink, "signal-handoffs", TRUE, NULL);
|
g_object_set (sink, "signal-handoffs", TRUE, NULL);
|
||||||
g_signal_connect (sink, "handoff", (GCallback) handoff_buffer_cb,
|
g_signal_connect (sink, "handoff", (GCallback) handoff_buffer_cb, NULL);
|
||||||
&wanted_end);
|
|
||||||
gst_bin_add_many (GST_BIN (bin), audiomixer, sink, NULL);
|
gst_bin_add_many (GST_BIN (bin), audiomixer, sink, NULL);
|
||||||
|
|
||||||
res = gst_element_link (audiomixer, sink);
|
res = gst_element_link (audiomixer, sink);
|
||||||
@ -999,16 +975,13 @@ GST_START_TEST (test_clip)
|
|||||||
buffer,
|
buffer,
|
||||||
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
||||||
ret = gst_pad_chain (sinkpad, buffer);
|
ret = gst_pad_chain (sinkpad, buffer);
|
||||||
main_loop = local_mainloop;
|
ck_assert_int_eq (ret, GST_FLOW_OK);
|
||||||
|
|
||||||
/* The aggregation is done in a dedicated thread, so we can't
|
/* The aggregation is done in a dedicated thread, so we can't
|
||||||
* not know when it is actually going to happen, so we just add\
|
* not know when it is actually going to happen, so we use a DRAIN query
|
||||||
* a 100 ms timeout to be able to then check that the aggregation
|
* to wait for it to complete.
|
||||||
* did happen as we do not have much other choice.
|
|
||||||
*/
|
*/
|
||||||
g_timeout_add (100, (GSourceFunc) _quit, main_loop);
|
gst_pad_query (sinkpad, drain);
|
||||||
g_main_loop_run (main_loop);
|
|
||||||
ck_assert_int_eq (ret, GST_FLOW_OK);
|
|
||||||
fail_unless (handoff_buffer == NULL);
|
fail_unless (handoff_buffer == NULL);
|
||||||
|
|
||||||
/* should be partially clipped */
|
/* should be partially clipped */
|
||||||
@ -1016,15 +989,14 @@ GST_START_TEST (test_clip)
|
|||||||
GST_BUFFER_TIMESTAMP (buffer) = 900 * GST_MSECOND;
|
GST_BUFFER_TIMESTAMP (buffer) = 900 * GST_MSECOND;
|
||||||
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
||||||
|
|
||||||
wanted_end = 135 * GST_MSECOND;
|
|
||||||
GST_DEBUG ("pushing buffer %p START %" GST_TIME_FORMAT " -- DURATION is %"
|
GST_DEBUG ("pushing buffer %p START %" GST_TIME_FORMAT " -- DURATION is %"
|
||||||
GST_TIME_FORMAT, buffer, GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
|
GST_TIME_FORMAT, buffer, GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
|
||||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
|
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
|
||||||
|
|
||||||
main_loop = local_mainloop;
|
|
||||||
ret = gst_pad_chain (sinkpad, buffer);
|
ret = gst_pad_chain (sinkpad, buffer);
|
||||||
ck_assert_int_eq (ret, GST_FLOW_OK);
|
ck_assert_int_eq (ret, GST_FLOW_OK);
|
||||||
g_main_loop_run (main_loop);
|
gst_pad_query (sinkpad, drain);
|
||||||
|
|
||||||
fail_unless (handoff_buffer != NULL);
|
fail_unless (handoff_buffer != NULL);
|
||||||
gst_buffer_replace (&handoff_buffer, NULL);
|
gst_buffer_replace (&handoff_buffer, NULL);
|
||||||
|
|
||||||
@ -1033,18 +1005,18 @@ GST_START_TEST (test_clip)
|
|||||||
GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
|
GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
|
||||||
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
||||||
|
|
||||||
wanted_end = 390 * GST_MSECOND;
|
|
||||||
GST_DEBUG ("pushing buffer %p END is %" GST_TIME_FORMAT,
|
GST_DEBUG ("pushing buffer %p END is %" GST_TIME_FORMAT,
|
||||||
buffer,
|
buffer,
|
||||||
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
||||||
ret = gst_pad_chain (sinkpad, buffer);
|
ret = gst_pad_chain (sinkpad, buffer);
|
||||||
ck_assert_int_eq (ret, GST_FLOW_OK);
|
ck_assert_int_eq (ret, GST_FLOW_OK);
|
||||||
g_main_loop_run (main_loop);
|
gst_pad_query (sinkpad, drain);
|
||||||
fail_unless (handoff_buffer != NULL);
|
fail_unless (handoff_buffer != NULL);
|
||||||
gst_buffer_replace (&handoff_buffer, NULL);
|
gst_buffer_replace (&handoff_buffer, NULL);
|
||||||
fail_unless (handoff_buffer == NULL);
|
fail_unless (handoff_buffer == NULL);
|
||||||
|
|
||||||
/* should be clipped and ok */
|
/* should be clipped and ok */
|
||||||
|
|
||||||
buffer = gst_buffer_new_and_alloc (44100);
|
buffer = gst_buffer_new_and_alloc (44100);
|
||||||
GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
|
GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
|
||||||
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
|
||||||
@ -1052,9 +1024,8 @@ GST_START_TEST (test_clip)
|
|||||||
buffer,
|
buffer,
|
||||||
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
GST_TIME_ARGS (GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer)));
|
||||||
ret = gst_pad_chain (sinkpad, buffer);
|
ret = gst_pad_chain (sinkpad, buffer);
|
||||||
g_timeout_add (100, (GSourceFunc) _quit, main_loop);
|
|
||||||
g_main_loop_run (main_loop);
|
|
||||||
ck_assert_int_eq (ret, GST_FLOW_OK);
|
ck_assert_int_eq (ret, GST_FLOW_OK);
|
||||||
|
gst_pad_query (sinkpad, drain);
|
||||||
fail_unless (handoff_buffer == NULL);
|
fail_unless (handoff_buffer == NULL);
|
||||||
|
|
||||||
gst_element_release_request_pad (audiomixer, sinkpad);
|
gst_element_release_request_pad (audiomixer, sinkpad);
|
||||||
@ -1063,6 +1034,7 @@ GST_START_TEST (test_clip)
|
|||||||
gst_bus_remove_signal_watch (bus);
|
gst_bus_remove_signal_watch (bus);
|
||||||
gst_object_unref (bus);
|
gst_object_unref (bus);
|
||||||
gst_object_unref (bin);
|
gst_object_unref (bin);
|
||||||
|
gst_query_unref (drain);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user