gstreamer/tests/check/elements/glbin.c
Matthew Waters fbef9220d3 gl*bin: fix transfer semantics for the create-element signal
We can either receive an element that is floating or not and need to
accomodate that in the signal return values.  Do so by removing the
floating flag.

https://bugzilla.gnome.org/show_bug.cgi?id=792597
2018-02-09 17:15:30 +11:00

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)
#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)