summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-02-19 18:24:40 -0300
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-02-22 17:27:52 -0300
commite5f96a7a191ec903d421da42fcb24f86d84ae040 (patch)
treec8a33684099f0efc2925997a1856851a8ae393fe
parent616f130d0513619710e0933647ceb2e1a5f82a13 (diff)
videorate: tests: New unit tests for upstream caps nego
Adds unit tests that check videorate's upstream caps negotiation works properly (put passthrough caps first) Fixes #608025
-rw-r--r--tests/check/elements/videorate.c111
1 files changed, 108 insertions, 3 deletions
diff --git a/tests/check/elements/videorate.c b/tests/check/elements/videorate.c
index 485545bf..010ee775 100644
--- a/tests/check/elements/videorate.c
+++ b/tests/check/elements/videorate.c
@@ -53,11 +53,24 @@ static GstPad *mysrcpad, *mysinkpad;
"framerate = (fraction) 25/1 , " \
"format = (fourcc) I420"
+#define VIDEO_CAPS_UNUSUAL_FRAMERATE \
+ "video/x-raw-yuv, " \
+ "width = (int) 240, " \
+ "height = (int) 120, " \
+ "framerate = (fraction) 999/7 , " \
+ "format = (fourcc) I420"
+
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (VIDEO_CAPS_TEMPLATE_STRING)
);
+static GstStaticPadTemplate downstreamsinktemplate =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (VIDEO_CAPS_STRING)
+ );
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
@@ -89,20 +102,27 @@ G_STMT_START { \
}
static GstElement *
-setup_videorate (void)
+setup_videorate_full (GstStaticPadTemplate * srctemplate,
+ GstStaticPadTemplate * sinktemplate)
{
GstElement *videorate;
GST_DEBUG ("setup_videorate");
videorate = gst_check_setup_element ("videorate");
- mysrcpad = gst_check_setup_src_pad (videorate, &srctemplate, NULL);
- mysinkpad = gst_check_setup_sink_pad (videorate, &sinktemplate, NULL);
+ mysrcpad = gst_check_setup_src_pad (videorate, srctemplate, NULL);
+ mysinkpad = gst_check_setup_sink_pad (videorate, sinktemplate, NULL);
gst_pad_set_active (mysrcpad, TRUE);
gst_pad_set_active (mysinkpad, TRUE);
return videorate;
}
+static GstElement *
+setup_videorate (void)
+{
+ return setup_videorate_full (&srctemplate, &sinktemplate);
+}
+
static void
cleanup_videorate (GstElement * videorate)
{
@@ -657,6 +677,89 @@ GST_START_TEST (test_non_ok_flow)
GST_END_TEST;
+GST_START_TEST (test_upstream_caps_nego)
+{
+ GstElement *videorate;
+ GstPad *videorate_pad;
+ GstCaps *expected_caps;
+ GstCaps *caps;
+ GstStructure *structure;
+
+ videorate = setup_videorate_full (&srctemplate, &downstreamsinktemplate);
+ fail_unless (gst_element_set_state (videorate,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ videorate_pad = gst_element_get_pad (videorate, "sink");
+ caps = gst_pad_get_caps (videorate_pad);
+
+ /* assemble the expected caps */
+ structure = gst_structure_from_string (VIDEO_CAPS_STRING, NULL);
+ expected_caps = gst_caps_new_empty ();
+ gst_caps_append_structure (expected_caps, structure);
+ structure = gst_structure_copy (structure);
+ gst_structure_set (structure, "framerate", GST_TYPE_FRACTION_RANGE,
+ 0, 1, G_MAXINT, 1, NULL);
+ gst_caps_append_structure (expected_caps, structure);
+
+ fail_unless (gst_caps_is_equal (expected_caps, caps));
+ gst_caps_unref (caps);
+ gst_caps_unref (expected_caps);
+ gst_object_unref (videorate_pad);
+
+ /* cleanup */
+ cleanup_videorate (videorate);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_selected_caps)
+{
+ GstElement *videorate;
+ GstElement *pipeline;
+ GstBus *bus;
+ GstMessage *msg;
+
+ GstPad *videorate_pad;
+ GstCaps *caps = NULL;
+ GstCaps *expected_caps = NULL;
+
+ pipeline = gst_parse_launch ("videotestsrc num-buffers=1 ! "
+ "! identity ! videorate name=videorate0 ! " VIDEO_CAPS_UNUSUAL_FRAMERATE
+ " ! fakesink", NULL);
+ fail_if (pipeline == NULL);
+ videorate = gst_bin_get_by_name (GST_BIN (pipeline), "videorate0");
+ fail_if (videorate == NULL);
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+ fail_if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE,
+ "could not set to playing");
+
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR);
+ fail_if (msg == NULL || GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
+
+ videorate_pad = gst_element_get_pad (videorate, "sink");
+ g_object_get (videorate_pad, "caps", &caps, NULL);
+ expected_caps = gst_caps_from_string (VIDEO_CAPS_UNUSUAL_FRAMERATE);
+
+ fail_unless (gst_caps_is_equal (expected_caps, caps));
+
+ /* cleanup */
+ gst_object_unref (bus);
+ gst_message_unref (msg);
+ gst_caps_unref (caps);
+ gst_caps_unref (expected_caps);
+ gst_object_unref (videorate_pad);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
static Suite *
videorate_suite (void)
{
@@ -671,6 +774,8 @@ videorate_suite (void)
tcase_add_test (tc_chain, test_no_framerate);
tcase_add_test (tc_chain, test_changing_size);
tcase_add_test (tc_chain, test_non_ok_flow);
+ tcase_add_test (tc_chain, test_upstream_caps_nego);
+ tcase_add_test (tc_chain, test_selected_caps);
return s;
}