srt: Add basic check test of srt[src|sink]

Add some basic tests for the srtsrc and the srtsink and set us up for
more advanced tests down the road.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5440>
This commit is contained in:
Jonas K Danielsson 2023-10-05 16:01:40 +02:00 committed by GStreamer Marge Bot
parent e93298e882
commit 7c4e6442db
2 changed files with 193 additions and 0 deletions

View file

@ -0,0 +1,192 @@
/* GStreamer
* Copyright (C) 2023 Jonas Danielsson <jonas.danielsson@spiideo.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.
*
*/
/* Using GValueArray for stats */
#define GLIB_DISABLE_DEPRECATION_WARNINGS
#include <gst/check/gstcheck.h>
#include <gst/check/gstharness.h>
#include "../ext/srt/gstsrt-enums.h"
static const gchar elements[][8] = { "srtsrc", "srtsink" };
static void
check_play (const gchar * src_uri,
GstSRTConnectionMode src_mode,
const gchar * sink_uri, GstSRTConnectionMode sink_mode)
{
GstHarness *h_src, *h_sink;
GstStructure *stats;
gint64 packets_received;
GstBuffer *in_buf, *out_buf;
gchar *src_launchline, *sink_launchline;
GstElement *src_element;
guint8 data[1316] = { 0 };
sink_launchline = g_strdup_printf ("srtsink uri=%s", sink_uri);
h_sink = gst_harness_new_parse (sink_launchline);
g_free (sink_launchline);
src_launchline = g_strdup_printf ("srtsrc name=src uri=%s", src_uri);
h_src = gst_harness_new_parse (src_launchline);
g_free (src_launchline);
gst_harness_set_src_caps_str (h_sink, "video/mpegts");
if (src_mode == GST_SRT_CONNECTION_MODE_LISTENER) {
fail_unless (gst_element_set_state (h_src->element,
GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE);
fail_unless (gst_element_set_state (h_sink->element,
GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE);
} else {
fail_unless (gst_element_set_state (h_sink->element,
GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE);
fail_unless (gst_element_set_state (h_src->element,
GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE);
}
in_buf = gst_buffer_new ();
gst_buffer_append_memory (in_buf,
gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
data, sizeof (data), 0, sizeof (data), NULL, NULL));
gst_harness_push (h_sink, in_buf);
out_buf = gst_harness_pull (h_src);
src_element = gst_bin_get_by_name (GST_BIN (h_src->element), "src");
g_object_get (src_element, "stats", &stats, NULL);
g_assert_cmpstr (gst_structure_get_name (stats), ==,
"application/x-srt-statistics");
if (src_mode == GST_SRT_CONNECTION_MODE_CALLER) {
fail_unless (gst_structure_get_int64 (stats,
"packets-received", &packets_received));
g_assert_cmpint (packets_received, ==, 1);
} else {
const GValue *array_value;
const GValue *value;
GValueArray *callers;
GstStructure *caller_stats;
fail_unless ((array_value = gst_structure_get_value (stats, "callers")));
callers = (GValueArray *) g_value_get_boxed (array_value);
value = g_value_array_get_nth (callers, 0);
caller_stats = GST_STRUCTURE (g_value_get_boxed (value));
fail_unless (gst_structure_get_int64 (caller_stats,
"packets-received", &packets_received));
g_assert_cmpint (packets_received, ==, 1);
}
gst_element_set_state (h_src->element, GST_STATE_NULL);
gst_element_set_state (h_sink->element, GST_STATE_NULL);
gst_buffer_unref (out_buf);
gst_structure_free (stats);
gst_object_unref (src_element);
gst_harness_teardown (h_src);
gst_harness_teardown (h_sink);
}
GST_START_TEST (test_create_and_unref)
{
GstElement *e;
e = gst_element_factory_make (elements[__i__], NULL);
g_assert_nonnull (e);
gst_element_set_state (e, GST_STATE_NULL);
gst_object_unref (e);
e = gst_element_factory_make (elements[__i__], NULL);
g_assert_nonnull (e);
gst_element_set_state (e, GST_STATE_NULL);
gst_object_unref (e);
}
GST_END_TEST;
GST_START_TEST (test_uri_to_properties)
{
GstElement *element;
gint latency = 0, poll_timeout = 0, mode = 0, pbkeylen = 0;
guint localport = 0;
gchar *streamid = NULL, *localaddress = NULL;
element = gst_element_factory_make (elements[__i__], NULL);
/* Sets properties to non-default values (make sure this stays in sync) */
g_object_set (element, "uri", "srt://83.0.2.14:4847?"
"latency=300" "&mode=listener" "&streamid=the-stream-id"
"&pbkeylen=32" "&poll-timeout=500", NULL);
g_object_get (element,
"latency", &latency, "mode", &mode, "streamid", &streamid,
"pbkeylen", &pbkeylen, "poll-timeout", &poll_timeout,
"localport", &localport, "localaddress", &localaddress, NULL);
/* Make sure these values are in sync with the one from the URI. */
g_assert_cmpint (latency, ==, 300);
g_assert_cmpint (mode, ==, 2);
g_assert_cmpstr (streamid, ==, "the-stream-id");
g_assert_cmpint (pbkeylen, ==, 32);
g_assert_cmpint (poll_timeout, ==, 500);
g_assert_cmpstr (localaddress, ==, "83.0.2.14");
g_assert_cmpint (localport, ==, 4847);
g_free (streamid);
g_free (localaddress);
gst_object_unref (element);
}
GST_END_TEST;
GST_START_TEST (test_src_caller_sink_listener)
{
check_play ("srt://127.0.0.1:3434?mode=caller",
GST_SRT_CONNECTION_MODE_CALLER,
"srt://:3434?mode=listener", GST_SRT_CONNECTION_MODE_LISTENER);
}
GST_END_TEST;
GST_START_TEST (test_src_listener_sink_caller)
{
check_play ("srt://:4242?mode=listener",
GST_SRT_CONNECTION_MODE_LISTENER,
"srt://127.0.0.1:4242?mode=caller", GST_SRT_CONNECTION_MODE_CALLER);
}
GST_END_TEST;
static Suite *
srt_suite (void)
{
Suite *s = suite_create ("srt");
TCase *tc_chain = tcase_create ("general");
suite_add_tcase (s, tc_chain);
tcase_add_loop_test (tc_chain, test_create_and_unref, 0,
G_N_ELEMENTS (elements));
tcase_add_loop_test (tc_chain, test_uri_to_properties, 0,
G_N_ELEMENTS (elements));
tcase_add_test (tc_chain, test_src_caller_sink_listener);
tcase_add_test (tc_chain, test_src_listener_sink_caller);
return s;
}
GST_CHECK_MAIN (srt);

View file

@ -69,6 +69,7 @@ base_tests = [
[['elements/rtpsrc.c'], get_option('rtp').disabled()],
[['elements/rtpsink.c'], get_option('rtp').disabled()],
[['elements/sdpdemux.c'], get_option('sdp').disabled(), [gstsdp_dep]],
[['elements/srt.c'], not srt_dep.found(), [srt_dep]],
[['elements/srtp.c'], not srtp_dep.found(), [srtp_dep]],
[['elements/switchbin.c'], get_option('switchbin').disabled()],
[['elements/videoframe-audiolevel.c'], get_option('videoframe_audiolevel').disabled()],