From dde7af4b9d55463201d649427ad52b4642b6f945 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 20 Dec 2010 14:49:02 -0300 Subject: [PATCH] jpegenc: Adds another test case Adds a test for jpegenc to check that is possible to negotiate and push buffers with different resolution one after another. https://bugzilla.gnome.org/show_bug.cgi?id=637686 --- tests/check/Makefile.am | 3 ++ tests/check/elements/jpegenc.c | 88 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 059eeda..5079bc7 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -202,6 +202,9 @@ elements_interleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_imagefreeze_LDADD = $(GST_BASE_LIBS) $(LDADD) -lgstvideo-$(GST_MAJORMINOR) +elements_jpegenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) +elements_jpegenc_LDADD = $(GST_BASE_LIBS) $(LDADD) -lgstapp-0.10 + elements_level_LDADD = $(LDADD) $(LIBM) elements_matroskamux_LDADD = $(GST_BASE_LIBS) $(LDADD) $(LIBM) diff --git a/tests/check/elements/jpegenc.c b/tests/check/elements/jpegenc.c index 674617d..2c992f7 100644 --- a/tests/check/elements/jpegenc.c +++ b/tests/check/elements/jpegenc.c @@ -23,11 +23,13 @@ #include #include +#include /* For ease of programming we use globals to keep refs for our floating * sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysinkpad; +static GstPad *mysrcpad; #define JPEG_CAPS_STRING "image/jpeg" @@ -52,6 +54,12 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_ALWAYS, GST_STATIC_CAPS (JPEG_CAPS_RESTRICTIVE)); +static GstStaticPadTemplate any_srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + static GstElement * setup_jpegenc (GstStaticPadTemplate * sinktemplate) { @@ -60,6 +68,8 @@ setup_jpegenc (GstStaticPadTemplate * sinktemplate) GST_DEBUG ("setup_jpegenc"); jpegenc = gst_check_setup_element ("jpegenc"); mysinkpad = gst_check_setup_sink_pad (jpegenc, sinktemplate, NULL); + mysrcpad = gst_check_setup_src_pad (jpegenc, &any_srctemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return jpegenc; @@ -71,11 +81,44 @@ cleanup_jpegenc (GstElement * jpegenc) GST_DEBUG ("cleanup_jpegenc"); gst_element_set_state (jpegenc, GST_STATE_NULL); + gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_sink_pad (jpegenc); + gst_check_teardown_src_pad (jpegenc); gst_check_teardown_element (jpegenc); } +static GstBuffer * +create_video_buffer (GstCaps * caps) +{ + GstElement *pipeline; + GstElement *cf; + GstElement *sink; + GstBuffer *buffer; + + pipeline = + gst_parse_launch + ("videotestsrc num-buffers=1 ! capsfilter name=cf ! appsink name=sink", + NULL); + g_assert (pipeline != NULL); + + cf = gst_bin_get_by_name (GST_BIN (pipeline), "cf"); + sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + + g_object_set (G_OBJECT (cf), "caps", caps, NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + buffer = gst_app_sink_pull_buffer (GST_APP_SINK (sink)); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + gst_object_unref (sink); + gst_object_unref (cf); + return buffer; +} + + GST_START_TEST (test_jpegenc_getcaps) { GstElement *jpegenc; @@ -129,6 +172,50 @@ GST_START_TEST (test_jpegenc_getcaps) GST_END_TEST; + +GST_START_TEST (test_jpegenc_different_caps) +{ + GstElement *jpegenc; + GstBuffer *buffer; + GstCaps *caps; + GstCaps *allowed_caps; + + /* now use a more restricted one and check the resulting caps */ + jpegenc = setup_jpegenc (&any_sinktemplate); + gst_element_set_state (jpegenc, GST_STATE_PLAYING); + + /* push first buffer with 800x600 resolution */ + caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, + 800, "height", G_TYPE_INT, 600, "framerate", + GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); + buffer = create_video_buffer (caps); + gst_caps_unref (caps); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + + /* check the allowed caps to see if a second buffer with a different + * caps could be negotiated */ + allowed_caps = gst_pad_get_allowed_caps (mysrcpad); + + /* the caps we want to negotiate to */ + caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, + 640, "height", G_TYPE_INT, 480, "framerate", + GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); + fail_unless (gst_caps_can_intersect (allowed_caps, caps)); + + /* push second buffer with 640x480 resolution */ + buffer = create_video_buffer (caps); + gst_caps_unref (caps); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + + gst_caps_unref (allowed_caps); + gst_element_set_state (jpegenc, GST_STATE_NULL); + cleanup_jpegenc (jpegenc); +} + +GST_END_TEST; + static Suite * jpegenc_suite (void) { @@ -137,6 +224,7 @@ jpegenc_suite (void) suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_jpegenc_getcaps); + tcase_add_test (tc_chain, test_jpegenc_different_caps); return s; } -- 2.7.4