mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
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:
parent
4fe5178957
commit
fb77e4db30
1 changed files with 31 additions and 104 deletions
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue