mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 18:20:44 +00:00
d5b18ae58f
Fixes the element leaks in the full variants of the glbin test.
504 lines
14 KiB
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)
|