gstreamer/subprojects/gst-plugins-base/tests/check/elements/glbin.c

504 lines
14 KiB
C

/* 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)
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 */ )
{
g_object_set (e, d->prop, _create_element_floating_cb (e, d->element_name),
NULL);
}
static void
_set_element_full (GstElement * e, struct src_data *d /* static */ )
{
GstElement *element = _create_element_full_cb (e, d->element_name);
g_object_set (e, d->prop, element, NULL);
gst_object_unref (element);
}
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)