From 0aa9424ff5bfc2fb3a474b8bccad2236e48fcb6b Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 9 Dec 2020 19:49:47 +1100 Subject: tests: add tests for videoflip Part-of: --- tests/check/elements/videoflip.c | 208 +++++++++++++++++++++++++++++++++++++++ tests/check/meson.build | 1 + 2 files changed, 209 insertions(+) create mode 100644 tests/check/elements/videoflip.c diff --git a/tests/check/elements/videoflip.c b/tests/check/elements/videoflip.c new file mode 100644 index 000000000..4a8d579de --- /dev/null +++ b/tests/check/elements/videoflip.c @@ -0,0 +1,208 @@ +/* GStreamer + * + * unit test for videofilter elements + * + * Copyright (C) <2006> Mark Nauwelaerts + * + * 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. + */ + +#include + +#include +#include +#include + +static GstBuffer * +create_test_video_buffer_rgba8 (GstVideoInfo * info) +{ + guint8 *data; + guint i = 0, j, k; + gsize stride = GST_VIDEO_INFO_PLANE_STRIDE (info, i); + + data = g_malloc0 (info->size); + + for (j = 0; j < GST_VIDEO_INFO_COMP_HEIGHT (info, i); j++) { + for (k = 0; k < GST_VIDEO_INFO_COMP_WIDTH (info, i); k++) { + data[(j * stride + 4 * k) + 0] = j % 255; + data[(j * stride + 4 * k) + 1] = k % 255; + data[(j * stride + 4 * k) + 2] = (j + k) % 255; + data[(j * stride + 4 * k) + 3] = 255; + } + } + + return gst_buffer_new_wrapped (data, info->size); +} + +GST_START_TEST (test_passthrough) +{ + GstHarness *flip = gst_harness_new ("videoflip"); + GstVideoInfo in_info, out_info; + GstCaps *in_caps, *out_caps; + GstEvent *e; + GstBuffer *buf; + + gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_RGBA, 4, 9); + in_caps = gst_video_info_to_caps (&in_info); + + gst_harness_set_src_caps (flip, in_caps); + + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_STREAM_START); + gst_event_unref (e); + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_CAPS); + gst_event_parse_caps (e, &out_caps); + fail_unless (gst_video_info_from_caps (&out_info, out_caps)); + fail_unless_equals_int (GST_VIDEO_INFO_WIDTH (&in_info), + GST_VIDEO_INFO_WIDTH (&out_info)); + fail_unless_equals_int (GST_VIDEO_INFO_HEIGHT (&in_info), + GST_VIDEO_INFO_HEIGHT (&out_info)); + gst_event_unref (e); + + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_SEGMENT); + gst_event_unref (e); + + buf = create_test_video_buffer_rgba8 (&in_info); + buf = gst_harness_push_and_pull (flip, buf); + fail_unless (buf != NULL); + gst_buffer_unref (buf); + + gst_harness_teardown (flip); +} + +GST_END_TEST; + +GST_START_TEST (test_change_method) +{ + GstHarness *flip = gst_harness_new ("videoflip"); + GstVideoInfo in_info, out_info; + GstCaps *in_caps, *out_caps; + GstEvent *e; + GstBuffer *buf; + + gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_RGBA, 4, 9); + in_caps = gst_video_info_to_caps (&in_info); + + gst_harness_set_src_caps (flip, in_caps); + + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_STREAM_START); + gst_event_unref (e); + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_CAPS); + gst_event_parse_caps (e, &out_caps); + fail_unless (gst_video_info_from_caps (&out_info, out_caps)); + fail_unless_equals_int (GST_VIDEO_INFO_WIDTH (&in_info), + GST_VIDEO_INFO_WIDTH (&out_info)); + fail_unless_equals_int (GST_VIDEO_INFO_HEIGHT (&in_info), + GST_VIDEO_INFO_HEIGHT (&out_info)); + gst_event_unref (e); + + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_SEGMENT); + gst_event_unref (e); + + buf = create_test_video_buffer_rgba8 (&in_info); + buf = gst_harness_push_and_pull (flip, buf); + fail_unless (buf != NULL); + gst_buffer_unref (buf); + + g_object_set (flip->element, "video-direction", 1 /* 90r */ , NULL); + + buf = create_test_video_buffer_rgba8 (&in_info); + fail_unless_equals_int (gst_harness_push (flip, buf), GST_FLOW_OK); + e = gst_harness_pull_event (flip); + fail_unless_equals_int (GST_EVENT_TYPE (e), GST_EVENT_CAPS); + gst_event_parse_caps (e, &out_caps); + fail_unless (gst_video_info_from_caps (&out_info, out_caps)); + fail_unless_equals_int (GST_VIDEO_INFO_WIDTH (&in_info), + GST_VIDEO_INFO_HEIGHT (&out_info)); + fail_unless_equals_int (GST_VIDEO_INFO_HEIGHT (&in_info), + GST_VIDEO_INFO_WIDTH (&out_info)); + gst_event_unref (e); + buf = gst_harness_pull (flip); + fail_unless (buf != NULL); + gst_buffer_unref (buf); + + gst_harness_teardown (flip); +} + +GST_END_TEST; + +GST_START_TEST (test_stress_change_method) +{ + GstHarness *flip = gst_harness_new ("videoflip"); + GParamSpec *pspec = + g_object_class_find_property (G_OBJECT_GET_CLASS (flip->element), + "video-direction"); + GstHarnessThread *thread_identity, *thread_90r; + GValue direction_identity = G_VALUE_INIT, direction_90r = G_VALUE_INIT; + GstVideoInfo in_info; + guint i = 0; +#define N_PUSHES 1000 + + gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_RGBA, 4, 9); + gst_harness_set_src_caps (flip, gst_video_info_to_caps (&in_info)); + + g_value_init (&direction_identity, pspec->value_type); + g_value_init (&direction_90r, pspec->value_type); + + fail_unless (gst_value_deserialize (&direction_identity, "identity")); + fail_unless (gst_value_deserialize (&direction_90r, "90r")); + + thread_identity = + gst_harness_stress_property_start_full (flip, "video-direction", + &direction_identity, 210); + thread_90r = + gst_harness_stress_property_start_full (flip, "video-direction", + &direction_90r, 160); + + while (i++ < N_PUSHES) { + GstBuffer *buf = create_test_video_buffer_rgba8 (&in_info); + buf = gst_harness_push_and_pull (flip, buf); + fail_unless (buf != NULL); + gst_buffer_unref (buf); + g_usleep (100); + } + + gst_harness_stress_thread_stop (thread_identity); + gst_harness_stress_thread_stop (thread_90r); + + g_value_unset (&direction_identity); + g_value_unset (&direction_90r); + + gst_harness_teardown (flip); +} + +GST_END_TEST; + +static Suite * +videoflip_suite (void) +{ + Suite *s = suite_create ("videoflip"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_change_method); + tcase_add_test (tc_chain, test_stress_change_method); + + return s; +} + +GST_CHECK_MAIN (videoflip); diff --git a/tests/check/meson.build b/tests/check/meson.build index 17429463f..91efc62d3 100644 --- a/tests/check/meson.build +++ b/tests/check/meson.build @@ -95,6 +95,7 @@ good_tests = [ [ 'elements/videobox' ], [ 'elements/videocrop' ], [ 'elements/videofilter' ], + [ 'elements/videoflip' ], [ 'elements/videomixer' ], [ 'elements/aspectratiocrop' ], [ 'pipelines/wavenc' ], -- cgit v1.2.1