tests: videoscale: simplify test and make it more robust

test_negotiation would occasionally time out, for unknown reasons.
Simplify the test setup and get rid of the main loop, busses, and
notify signals. With this I can no longer easily reproduce the
timeout. Fingers crossed.
This commit is contained in:
Tim-Philipp Müller 2018-02-19 17:50:51 +00:00
parent 4fe5178957
commit fb77e4db30

View file

@ -499,89 +499,13 @@ CREATE_TEST (test_upscale_1x240_640x480_method_3, 3, 1, 240, 640, 480);
#ifndef VSCALE_TEST_GROUP #ifndef VSCALE_TEST_GROUP
typedef struct
{
gint width, height;
gint par_n, par_d;
gboolean ok;
GMainLoop *loop;
} TestNegotiationData;
static void
_test_negotiation_message (GstBus * bus, GstMessage * message,
TestNegotiationData * data)
{
GError *err = NULL;
gchar *debug;
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR:
gst_message_parse_error (message, &err, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), err, debug);
g_error_free (err);
g_free (debug);
g_assert_not_reached ();
break;
case GST_MESSAGE_WARNING:
gst_message_parse_warning (message, &err, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), err, debug);
g_error_free (err);
g_free (debug);
g_assert_not_reached ();
break;
case GST_MESSAGE_EOS:
g_main_loop_quit (data->loop);
break;
default:
break;
}
}
static void
_test_negotiation_notify_caps (GObject * src, GParamSpec * pspec,
TestNegotiationData * data)
{
GstCaps *caps;
GstStructure *s;
gint width, height;
gint par_n = 0, par_d = 0;
g_object_get (src, "caps", &caps, NULL);
if (caps == NULL)
return;
s = gst_caps_get_structure (caps, 0);
fail_unless (gst_structure_get_int (s, "width", &width));
fail_unless (gst_structure_get_int (s, "height", &height));
fail_unless (gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_n,
&par_d) || (data->par_n == 1 && data->par_d == 1));
gst_caps_unref (caps);
fail_unless_equals_int (width, data->width);
fail_unless_equals_int (height, data->height);
if (par_n != 0 || par_d != 0) {
fail_unless_equals_int (par_n, data->par_n);
fail_unless_equals_int (par_d, data->par_d);
}
data->ok = (width == data->width) && (height == data->height)
&& (par_n == data->par_n) && (par_d == data->par_d);
g_main_loop_quit (data->loop);
}
static void static void
_test_negotiation (const gchar * src_templ, const gchar * sink_templ, _test_negotiation (const gchar * src_templ, const gchar * sink_templ,
gint width, gint height, gint par_n, gint par_d) gint width, gint height, gint par_n, gint par_d)
{ {
GstElement *pipeline; GstElement *pipeline;
GstElement *src, *capsfilter1, *scale, *capsfilter2, *sink; GstElement *src, *capsfilter1, *scale, *capsfilter2, *sink;
GstBus *bus;
GMainLoop *loop;
GstCaps *caps; GstCaps *caps;
TestNegotiationData data = { 0, 0, 0, 0, FALSE, NULL };
GstPad *pad; GstPad *pad;
GST_DEBUG ("Running test for src templ caps '%s' and sink templ caps '%s'", GST_DEBUG ("Running test for src templ caps '%s' and sink templ caps '%s'",
@ -592,7 +516,7 @@ _test_negotiation (const gchar * src_templ, const gchar * sink_templ,
src = gst_element_factory_make ("videotestsrc", "src"); src = gst_element_factory_make ("videotestsrc", "src");
fail_unless (src != NULL); fail_unless (src != NULL);
g_object_set (G_OBJECT (src), "num-buffers", 1, NULL); g_object_set (G_OBJECT (src), "num-buffers", 1, "pattern", 2, NULL);
capsfilter1 = gst_element_factory_make ("capsfilter", "filter1"); capsfilter1 = gst_element_factory_make ("capsfilter", "filter1");
fail_unless (capsfilter1 != NULL); fail_unless (capsfilter1 != NULL);
@ -611,15 +535,8 @@ _test_negotiation (const gchar * src_templ, const gchar * sink_templ,
g_object_set (G_OBJECT (capsfilter2), "caps", caps, NULL); g_object_set (G_OBJECT (capsfilter2), "caps", caps, NULL);
gst_caps_unref (caps); gst_caps_unref (caps);
pad = gst_element_get_static_pad (capsfilter2, "sink");
fail_unless (pad != NULL);
g_signal_connect (pad, "notify::caps",
G_CALLBACK (_test_negotiation_notify_caps), &data);
gst_object_unref (pad);
sink = gst_element_factory_make ("fakesink", "sink"); sink = gst_element_factory_make ("fakesink", "sink");
fail_unless (sink != NULL); fail_unless (sink != NULL);
g_object_set (sink, "async", FALSE, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, capsfilter1, scale, capsfilter2, gst_bin_add_many (GST_BIN (pipeline), src, capsfilter1, scale, capsfilter2,
sink, NULL); sink, NULL);
@ -633,37 +550,47 @@ _test_negotiation (const gchar * src_templ, const gchar * sink_templ,
fail_unless (gst_element_link_pads_full (capsfilter2, "src", sink, "sink", fail_unless (gst_element_link_pads_full (capsfilter2, "src", sink, "sink",
LINK_CHECK_FLAGS)); LINK_CHECK_FLAGS));
loop = g_main_loop_new (NULL, FALSE); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED),
GST_STATE_CHANGE_ASYNC);
bus = gst_element_get_bus (pipeline); /* Wait for pipeline to preroll, at which point negotiation is finished */
fail_unless (bus != NULL); fail_unless_equals_int (gst_element_get_state (pipeline, NULL, NULL, -1),
gst_bus_add_signal_watch (bus); GST_STATE_CHANGE_SUCCESS);
data.loop = loop; /* Get negotiated caps */
data.width = width; pad = gst_element_get_static_pad (capsfilter2, "sink");
data.height = height; fail_unless (pad != NULL);
data.par_n = par_n; caps = gst_pad_get_current_caps (pad);
data.par_d = par_d; fail_unless (caps != NULL);
data.ok = FALSE; gst_object_unref (pad);
g_signal_connect (bus, "message", G_CALLBACK (_test_negotiation_message), /* Check negotiated caps */
&data); {
gint out_par_n = 0, out_par_d = 0;
gint out_width, out_height;
GstStructure *s;
gst_bus_remove_signal_watch (bus); s = gst_caps_get_structure (caps, 0);
gst_object_unref (bus);
fail_unless (gst_element_set_state (pipeline, fail_unless (gst_structure_get_int (s, "width", &out_width));
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); fail_unless (gst_structure_get_int (s, "height", &out_height));
fail_unless (gst_structure_get_fraction (s, "pixel-aspect-ratio",
&out_par_n, &out_par_d) || (par_n == 1 && par_d == 1));
g_main_loop_run (loop); fail_unless_equals_int (width, out_width);
fail_unless_equals_int (height, out_height);
fail_unless (data.ok == TRUE); if (par_n != 0 || par_d != 0) {
fail_unless_equals_int (par_n, out_par_n);
fail_unless_equals_int (par_d, out_par_d);
}
}
gst_caps_unref (caps);
/* clean up */
fail_unless (gst_element_set_state (pipeline, fail_unless (gst_element_set_state (pipeline,
GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
gst_object_unref (pipeline); gst_object_unref (pipeline);
g_main_loop_unref (loop);
} }
GST_START_TEST (test_negotiation) GST_START_TEST (test_negotiation)