/* GStreamer * * Unit tests for glimagesink * * Copyright (C) 2014 Julien Isorce * Copyright (C) 2016 Matthew Waters * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include typedef void (*ElementOperation) (GstElement * e, gpointer user_data); typedef GstElement *(*CreateElement) (GstElement * src, gpointer unused); #define CREATE_ELEMENT(e,c,d) \ g_signal_connect (e, "create-element", G_CALLBACK (c), d) #define SET_ELEMENT(e,p,c,d) \ g_object_set (e, p, c (e, d), NULL) static GstElement * _create_element_floating_cb (GstElement * src, const gchar * name) { return gst_element_factory_make (name, NULL); } static GstElement * _create_element_full_cb (GstElement * src, const gchar * name) { return gst_object_ref_sink (gst_element_factory_make (name, NULL)); } struct src_data { const gchar *prop; const gchar *element_name; }; static void _set_element_floating (GstElement * e, struct src_data *d /* static */ ) { SET_ELEMENT (e, d->prop, _create_element_floating_cb, (gchar *) d->element_name); } static void _set_element_full (GstElement * e, struct src_data *d /* static */ ) { SET_ELEMENT (e, d->prop, _create_element_full_cb, (gchar *) d->element_name); } static void _set_element_floating_floating (GstElement * e, struct src_data *d /* static */ ) { _set_element_floating (e, d); _set_element_floating (e, d); } static void _set_element_floating_full (GstElement * e, struct src_data *d /* static */ ) { _set_element_floating (e, d); _set_element_full (e, d); } static void _set_element_full_full (GstElement * e, struct src_data *d /* static */ ) { _set_element_full (e, d); _set_element_full (e, d); } static void _set_element_full_floating (GstElement * e, struct src_data *d /* static */ ) { _set_element_full (e, d); _set_element_floating (e, d); } static void _create_element_floating (GstElement * e, const gchar * name /* static */ ) { CREATE_ELEMENT (e, _create_element_floating_cb, (gchar *) name); } static void _create_element_full (GstElement * e, const gchar * name /* static */ ) { CREATE_ELEMENT (e, _create_element_full_cb, (gchar *) name); } static void _test_glsrcbin (ElementOperation op, gpointer user_data) { GstElement *pipe = gst_pipeline_new (NULL); GstElement *src = gst_element_factory_make ("glsrcbin", NULL); GstElement *sink = gst_element_factory_make ("glimagesink", NULL); gst_bin_add_many (GST_BIN (pipe), src, sink, NULL); gst_element_link (src, sink); op (src, user_data); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); } GST_START_TEST (test_glsrcbin_set_element_floating) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_set_element_full) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_full, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_set_element_floating_floating) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_floating_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_set_element_floating_full) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_floating_full, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_set_element_full_floating) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_full_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_set_element_full_full) { struct src_data d = { "src", "gltestsrc" }; _test_glsrcbin ((ElementOperation) _set_element_full_full, &d); } GST_END_TEST; GST_START_TEST (test_glsrcbin_create_element_floating) { _test_glsrcbin ((ElementOperation) _create_element_floating, (gchar *) "gltestsrc"); } GST_END_TEST; GST_START_TEST (test_glsrcbin_create_element_full) { _test_glsrcbin ((ElementOperation) _create_element_full, (gchar *) "gltestsrc"); } GST_END_TEST; static void _test_glsinkbin (ElementOperation op, gpointer user_data) { GstElement *pipe = gst_pipeline_new (NULL); GstElement *src = gst_element_factory_make ("gltestsrc", NULL); GstElement *sink = gst_element_factory_make ("glsinkbin", NULL); gst_bin_add_many (GST_BIN (pipe), src, sink, NULL); gst_element_link (src, sink); op (sink, user_data); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); } GST_START_TEST (test_glsinkbin_set_element_floating) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsinkbin_set_element_full) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_full, &d); } GST_END_TEST; GST_START_TEST (test_glsinkbin_create_element_floating) { _test_glsinkbin ((ElementOperation) _create_element_floating, (gchar *) "glimagesinkelement"); } GST_END_TEST; GST_START_TEST (test_glsinkbin_create_element_full) { _test_glsinkbin ((ElementOperation) _create_element_full, (gchar *) "glimagesinkelement"); } GST_END_TEST; GST_START_TEST (test_glsinkbin_set_element_floating_floating) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_floating_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsinkbin_set_element_floating_full) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_floating_full, &d); } GST_END_TEST; GST_START_TEST (test_glsinkbin_set_element_full_floating) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_full_floating, &d); } GST_END_TEST; GST_START_TEST (test_glsinkbin_set_element_full_full) { struct src_data d = { "sink", "glimagesinkelement" }; _test_glsinkbin ((ElementOperation) _set_element_full_full, &d); } GST_END_TEST; static void _test_glfilterbin (ElementOperation op, gpointer user_data) { GstElement *pipe = gst_pipeline_new (NULL); GstElement *src = gst_element_factory_make ("gltestsrc", NULL); GstElement *filter = gst_element_factory_make ("glfilterbin", NULL); GstElement *sink = gst_element_factory_make ("glimagesinkelement", NULL); gst_bin_add_many (GST_BIN (pipe), src, filter, sink, NULL); gst_element_link_many (src, filter, sink, NULL); op (filter, user_data); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); } GST_START_TEST (test_glfilterbin_set_element_floating) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_floating, &d); } GST_END_TEST; GST_START_TEST (test_glfilterbin_set_element_full) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_full, &d); } GST_END_TEST; GST_START_TEST (test_glfilterbin_create_element_floating) { _test_glfilterbin ((ElementOperation) _create_element_floating, (gchar *) "gleffects_identity"); } GST_END_TEST; GST_START_TEST (test_glfilterbin_create_element_full) { _test_glfilterbin ((ElementOperation) _create_element_full, (gchar *) "gleffects_identity"); } GST_END_TEST; GST_START_TEST (test_glfilterbin_set_element_floating_floating) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_floating_floating, &d); } GST_END_TEST; GST_START_TEST (test_glfilterbin_set_element_floating_full) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_floating_full, &d); } GST_END_TEST; GST_START_TEST (test_glfilterbin_set_element_full_floating) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_full_floating, &d); } GST_END_TEST; GST_START_TEST (test_glfilterbin_set_element_full_full) { struct src_data d = { "filter", "gleffects_identity" }; _test_glfilterbin ((ElementOperation) _set_element_full_full, &d); } GST_END_TEST; #if 0 /* FIXME: add when gl mixers are added to base */ static void _test_glmixerbin (ElementOperation op, gpointer user_data) { GstElement *pipe = gst_pipeline_new (NULL); GstElement *src = gst_element_factory_make ("gltestsrc", NULL); GstElement *mixer = gst_element_factory_make ("glmixerbin", NULL); GstElement *sink = gst_element_factory_make ("glimagesinkelement", NULL); gst_bin_add_many (GST_BIN (pipe), src, mixer, sink, NULL); gst_element_link_many (src, mixer, sink, NULL); op (mixer, user_data); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); } GST_START_TEST (test_glmixerbin_set_element_floating) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_floating, &d); } GST_END_TEST; GST_START_TEST (test_glmixerbin_set_element_full) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_full, &d); } GST_END_TEST; GST_START_TEST (test_glmixerbin_create_element_floating) { _test_glmixerbin ((ElementOperation) _create_element_floating, (gchar *) "glvideomixerelement"); } GST_END_TEST; GST_START_TEST (test_glmixerbin_create_element_full) { _test_glmixerbin ((ElementOperation) _create_element_full, (gchar *) "glvideomixerelement"); } GST_END_TEST; GST_START_TEST (test_glmixerbin_set_element_floating_floating) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_floating_floating, &d); } GST_END_TEST; GST_START_TEST (test_glmixerbin_set_element_floating_full) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_floating_full, &d); } GST_END_TEST; GST_START_TEST (test_glmixerbin_set_element_full_floating) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_full_floating, &d); } GST_END_TEST; GST_START_TEST (test_glmixerbin_set_element_full_full) { struct src_data d = { "mixer", "glvideomixerelement" }; _test_glmixerbin ((ElementOperation) _set_element_full_full, &d); } GST_END_TEST; #endif static Suite * glbin_suite (void) { Suite *s = suite_create ("glbin"); TCase *tc; tc = tcase_create ("glsrcbin"); tcase_add_test (tc, test_glsrcbin_create_element_floating); tcase_add_test (tc, test_glsrcbin_create_element_full); tcase_add_test (tc, test_glsrcbin_set_element_floating); tcase_add_test (tc, test_glsrcbin_set_element_full); tcase_add_test (tc, test_glsrcbin_set_element_floating_floating); tcase_add_test (tc, test_glsrcbin_set_element_full_floating); tcase_add_test (tc, test_glsrcbin_set_element_floating_full); tcase_add_test (tc, test_glsrcbin_set_element_full_full); suite_add_tcase (s, tc); tc = tcase_create ("glsinkbin"); tcase_add_test (tc, test_glsinkbin_create_element_floating); tcase_add_test (tc, test_glsinkbin_create_element_full); tcase_add_test (tc, test_glsinkbin_set_element_floating); tcase_add_test (tc, test_glsinkbin_set_element_full); tcase_add_test (tc, test_glsinkbin_set_element_floating_floating); tcase_add_test (tc, test_glsinkbin_set_element_full_floating); tcase_add_test (tc, test_glsinkbin_set_element_floating_full); tcase_add_test (tc, test_glsinkbin_set_element_full_full); suite_add_tcase (s, tc); tc = tcase_create ("glfilterbin"); tcase_add_test (tc, test_glfilterbin_create_element_floating); tcase_add_test (tc, test_glfilterbin_create_element_full); tcase_add_test (tc, test_glfilterbin_set_element_floating); tcase_add_test (tc, test_glfilterbin_set_element_full); tcase_add_test (tc, test_glfilterbin_set_element_floating_floating); tcase_add_test (tc, test_glfilterbin_set_element_full_floating); tcase_add_test (tc, test_glfilterbin_set_element_floating_full); tcase_add_test (tc, test_glfilterbin_set_element_full_full); suite_add_tcase (s, tc); #if 0 tc = tcase_create ("glmixerbin"); tcase_add_test (tc, test_glmixerbin_create_element_floating); tcase_add_test (tc, test_glmixerbin_create_element_full); tcase_add_test (tc, test_glmixerbin_set_element_floating); tcase_add_test (tc, test_glmixerbin_set_element_full); tcase_add_test (tc, test_glmixerbin_set_element_floating_floating); tcase_add_test (tc, test_glmixerbin_set_element_full_floating); tcase_add_test (tc, test_glmixerbin_set_element_floating_full); tcase_add_test (tc, test_glmixerbin_set_element_full_full); suite_add_tcase (s, tc); #endif return s; } GST_CHECK_MAIN (glbin)