--- /dev/null
+/* GStreamer
+ *
+ * Unit tests for glimagesink
+ *
+ * Copyright (C) 2014 Julien Isorce <j.isorce@samsung.com>
+ * Copyright (C) 2016 Matthew Waters <matthew@centricular.com>
+ *
+ * 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 <gst/gst.h>
+#include <gst/check/gstcheck.h>
+
+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)