Commit 306d5021 authored by Mathieu Duponchelle's avatar Mathieu Duponchelle 🐸 Committed by Tim-Philipp Müller

tests: remove rtpaux test

The initial mission statement for this test was:

* demonstrate usage of the request-aux-* signals in rtpbin
* test the rtx elements

We have examples that serve the first use case, and better
(harnessed) tests for the second use case.

This test is slow and racy, it served its purpose but can now
be removed.

Fixes #533
parent 1081a2ee
......@@ -243,7 +243,6 @@ endif
if USE_PLUGIN_RTPMANAGER
check_rtpmanager = \
elements/rtpaux \
elements/rtpbin \
elements/rtpbin_buffer_list \
elements/rtpbundle \
......@@ -616,9 +615,6 @@ elements_rtpfunnel_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp-$(GST_API_VERSION)
elements_rtpcollision_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
elements_rtpcollision_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_NET_LIBS) -lgstrtp-$(GST_API_VERSION) $(GIO_LIBS) $(LDADD)
elements_rtpaux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
elements_rtpaux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
elements_rtpbundle_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
elements_rtpbundle_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
......
......@@ -52,7 +52,6 @@ rganalysis
rglimiter
rgvolume
rtp-payloading
rtpaux
rtpbin
rtpbin_buffer_list
rtpbundle
......
/* GStreamer
*
* Copyright (C) 2013 Collabora Ltd.
* @author Julien Isorce <julien.isorce@collabora.co.uk>
*
* 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 <gst/check/gstcheck.h>
#include <gst/check/gstconsistencychecker.h>
#include <gst/check/gsttestclock.h>
#include <gst/rtp/gstrtpbuffer.h>
static gboolean send_pipeline_eos = FALSE;
static gboolean receive_pipeline_eos = FALSE;
static void
message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
{
GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
GST_MESSAGE_SRC (message), message);
switch (message->type) {
case GST_MESSAGE_EOS:
if (!strcmp ("pipeline_send",
GST_OBJECT_NAME (GST_MESSAGE_SRC (message))))
send_pipeline_eos = TRUE;
else if (!strcmp ("pipeline_receive",
GST_OBJECT_NAME (GST_MESSAGE_SRC (message))))
receive_pipeline_eos = TRUE;
else
fail ("Unknown pipeline: %s",
GST_OBJECT_NAME (GST_MESSAGE_SRC (message)));
break;
case GST_MESSAGE_WARNING:{
GError *gerror;
gchar *debug;
gst_message_parse_warning (message, &gerror, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
g_error_free (gerror);
g_free (debug);
break;
}
case GST_MESSAGE_ERROR:{
GError *gerror;
gchar *debug;
gst_message_parse_error (message, &gerror, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
g_error_free (gerror);
g_free (debug);
fail ("Error!");
break;
}
default:
break;
}
}
typedef struct
{
guint count;
guint nb_packets;
guint drop_every_n_packets;
} RTXSendData;
static GstPadProbeReturn
rtprtxsend_srcpad_probe (GstPad * pad, GstPadProbeInfo * info,
gpointer user_data)
{
GstPadProbeReturn ret = GST_PAD_PROBE_OK;
if (info->type == (GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH)) {
GstBuffer *buffer = GST_BUFFER (info->data);
RTXSendData *rtxdata = (RTXSendData *) user_data;
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
guint payload_type = 0;
gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp);
payload_type = gst_rtp_buffer_get_payload_type (&rtp);
/* main stream packets */
if (payload_type == 96) {
/* count packets of the main stream */
++rtxdata->nb_packets;
/* drop some packets */
if (rtxdata->count < rtxdata->drop_every_n_packets) {
++rtxdata->count;
} else {
/* drop a packet every 'rtxdata->count' packets */
rtxdata->count = 1;
ret = GST_PAD_PROBE_DROP;
}
} else {
/* retransmission packets */
}
gst_rtp_buffer_unmap (&rtp);
}
return ret;
}
static void
on_rtpbinreceive_pad_added (GstElement * element, GstPad * newPad,
gpointer data)
{
GstElement *rtpdepayloader = GST_ELEMENT (data);
gchar *padName = gst_pad_get_name (newPad);
if (g_str_has_prefix (padName, "recv_rtp_src_")) {
GstPad *sinkpad = gst_element_get_static_pad (rtpdepayloader, "sink");
gst_pad_link (newPad, sinkpad);
gst_object_unref (sinkpad);
}
g_free (padName);
}
static gboolean
on_timeout (gpointer data)
{
GstEvent *eos = gst_event_new_eos ();
if (!gst_element_send_event (GST_ELEMENT (data), eos)) {
GST_ERROR ("failed to send end of stream event");
gst_event_unref (eos);
}
return FALSE;
}
static GstElement *
request_aux_receive (GstElement * rtpbin, guint sessid, GstElement * receive)
{
GstElement *bin;
GstPad *pad;
GST_INFO ("creating AUX receiver");
bin = gst_bin_new (NULL);
gst_bin_add (GST_BIN (bin), receive);
pad = gst_element_get_static_pad (receive, "src");
gst_element_add_pad (bin, gst_ghost_pad_new ("src_0", pad));
gst_object_unref (pad);
pad = gst_element_get_static_pad (receive, "sink");
gst_element_add_pad (bin, gst_ghost_pad_new ("sink_0", pad));
gst_object_unref (pad);
return bin;
}
static GstElement *
request_aux_send (GstElement * rtpbin, guint sessid, GstElement * send)
{
GstElement *bin;
GstPad *pad;
GST_INFO ("creating AUX sender");
bin = gst_bin_new (NULL);
gst_bin_add (GST_BIN (bin), send);
pad = gst_element_get_static_pad (send, "src");
gst_element_add_pad (bin, gst_ghost_pad_new ("src_0", pad));
gst_object_unref (pad);
pad = gst_element_get_static_pad (send, "sink");
gst_element_add_pad (bin, gst_ghost_pad_new ("sink_0", pad));
gst_object_unref (pad);
return bin;
}
GST_START_TEST (test_simple_rtpbin_aux)
{
GstElement *binsend, *rtpbinsend, *src, *encoder, *rtppayloader,
*rtprtxsend, *sendrtp_udpsink, *sendrtcp_udpsink, *sendrtcp_udpsrc;
GstElement *binreceive, *rtpbinreceive, *recvrtp_udpsrc, *recvrtcp_udpsrc,
*recvrtcp_udpsink, *rtprtxreceive, *rtpdepayloader, *decoder, *converter,
*sink;
GstBus *bussend;
GstBus *busreceive;
gboolean res;
GstCaps *rtpcaps = NULL;
GstStructure *pt_map;
GstStateChangeReturn state_res = GST_STATE_CHANGE_FAILURE;
GstPad *srcpad = NULL;
guint nb_rtx_send_packets = 0;
guint nb_rtx_recv_packets = 0;
RTXSendData send_rtxdata;
send_rtxdata.count = 1;
send_rtxdata.nb_packets = 0;
send_rtxdata.drop_every_n_packets = 25;
GST_INFO ("preparing test");
/* build pipeline */
binsend = gst_pipeline_new ("pipeline_send");
bussend = gst_element_get_bus (binsend);
gst_bus_add_signal_watch_full (bussend, G_PRIORITY_HIGH);
binreceive = gst_pipeline_new ("pipeline_receive");
busreceive = gst_element_get_bus (binreceive);
gst_bus_add_signal_watch_full (busreceive, G_PRIORITY_HIGH);
rtpbinsend = gst_element_factory_make ("rtpbin", "rtpbinsend");
g_object_set (rtpbinsend, "latency", 200, "do-retransmission", TRUE, NULL);
src = gst_element_factory_make ("audiotestsrc", "src");
encoder = gst_element_factory_make ("alawenc", "encoder");
rtppayloader = gst_element_factory_make ("rtppcmapay", "rtppayloader");
rtprtxsend = gst_element_factory_make ("rtprtxsend", "rtprtxsend");
sendrtp_udpsink = gst_element_factory_make ("udpsink", "sendrtp_udpsink");
g_object_set (sendrtp_udpsink, "host", "127.0.0.1", NULL);
g_object_set (sendrtp_udpsink, "port", 5006, NULL);
sendrtcp_udpsink = gst_element_factory_make ("udpsink", "sendrtcp_udpsink");
g_object_set (sendrtcp_udpsink, "host", "127.0.0.1", NULL);
g_object_set (sendrtcp_udpsink, "port", 5007, NULL);
g_object_set (sendrtcp_udpsink, "sync", FALSE, NULL);
g_object_set (sendrtcp_udpsink, "async", FALSE, NULL);
sendrtcp_udpsrc = gst_element_factory_make ("udpsrc", "sendrtcp_udpsrc");
g_object_set (sendrtcp_udpsrc, "port", 5009, NULL);
rtpbinreceive = gst_element_factory_make ("rtpbin", "rtpbinreceive");
g_object_set (rtpbinreceive, "latency", 200, "do-retransmission", TRUE, NULL);
recvrtp_udpsrc = gst_element_factory_make ("udpsrc", "recvrtp_udpsrc");
g_object_set (recvrtp_udpsrc, "port", 5006, NULL);
rtpcaps =
gst_caps_from_string
("application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA,payload=(int)96");
g_object_set (recvrtp_udpsrc, "caps", rtpcaps, NULL);
gst_caps_unref (rtpcaps);
recvrtcp_udpsrc = gst_element_factory_make ("udpsrc", "recvrtcp_udpsrc");
g_object_set (recvrtcp_udpsrc, "port", 5007, NULL);
recvrtcp_udpsink = gst_element_factory_make ("udpsink", "recvrtcp_udpsink");
g_object_set (recvrtcp_udpsink, "host", "127.0.0.1", NULL);
g_object_set (recvrtcp_udpsink, "port", 5009, NULL);
g_object_set (recvrtcp_udpsink, "sync", FALSE, NULL);
g_object_set (recvrtcp_udpsink, "async", FALSE, NULL);
rtprtxreceive = gst_element_factory_make ("rtprtxreceive", "rtprtxreceive");
rtpdepayloader = gst_element_factory_make ("rtppcmadepay", "rtpdepayloader");
decoder = gst_element_factory_make ("alawdec", "decoder");
converter = gst_element_factory_make ("identity", "converter");
sink = gst_element_factory_make ("fakesink", "sink");
g_object_set (sink, "sync", TRUE, NULL);
gst_bin_add_many (GST_BIN (binsend), rtpbinsend, src, encoder, rtppayloader,
sendrtp_udpsink, sendrtcp_udpsink, sendrtcp_udpsrc, NULL);
gst_bin_add_many (GST_BIN (binreceive), rtpbinreceive,
recvrtp_udpsrc, recvrtcp_udpsrc, recvrtcp_udpsink,
rtpdepayloader, decoder, converter, sink, NULL);
g_signal_connect (rtpbinreceive, "pad-added",
G_CALLBACK (on_rtpbinreceive_pad_added), rtpdepayloader);
pt_map = gst_structure_new ("application/x-rtp-pt-map",
"96", G_TYPE_UINT, 99, NULL);
g_object_set (rtppayloader, "pt", 96, NULL);
g_object_set (rtppayloader, "seqnum-offset", 1, NULL);
g_object_set (rtprtxsend, "payload-type-map", pt_map, NULL);
g_object_set (rtprtxreceive, "payload-type-map", pt_map, NULL);
gst_structure_free (pt_map);
/* set rtp aux receive */
g_signal_connect (rtpbinreceive, "request-aux-receiver", (GCallback)
request_aux_receive, rtprtxreceive);
/* set rtp aux send */
g_signal_connect (rtpbinsend, "request-aux-sender", (GCallback)
request_aux_send, rtprtxsend);
/* gst-launch-1.0 rtpbin name=rtpbin audiotestsrc ! amrnbenc ! rtpamrpay ! \
* rtpbin.send_rtp_sink_1 rtpbin.send_rtp_src_1 ! udpsink host="127.0.0.1" \
* port=5002 rtpbin.send_rtcp_src_1 ! udpsink host="127.0.0.1" port=5003 \
* sync=false async=false udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1
*/
res = gst_element_link (src, encoder);
fail_unless (res == TRUE, NULL);
res = gst_element_link (encoder, rtppayloader);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (rtppayloader, "src", rtpbinsend,
"send_rtp_sink_0", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (rtpbinsend, "send_rtp_src_0", sendrtp_udpsink,
"sink", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (rtpbinsend, "send_rtcp_src_0",
sendrtcp_udpsink, "sink", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (sendrtcp_udpsrc, "src", rtpbinsend,
"recv_rtcp_sink_0", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
srcpad = gst_element_get_static_pad (rtpbinsend, "send_rtp_src_0");
gst_pad_add_probe (srcpad,
(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH),
(GstPadProbeCallback) rtprtxsend_srcpad_probe, &send_rtxdata, NULL);
gst_object_unref (srcpad);
/* gst-launch-1.0 rtpbin name=rtpbin udpsrc caps="application/x-rtp,media=(string)audio, \
* clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,o
* ctet-align=(string)1" port=5002 ! rtpbin.recv_rtp_sink_1 rtpbin. ! rtpamrdepay ! \
* amrnbdec ! fakesink sync=True udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \
* rtpbin.send_rtcp_src_1 ! udpsink host="127.0.0.1" port=5007 sync=false async=false
*/
res =
gst_element_link_pads_full (recvrtp_udpsrc, "src", rtpbinreceive,
"recv_rtp_sink_0", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (rtpdepayloader, "src", decoder, "sink",
GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res = gst_element_link (decoder, converter);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (converter, "src", sink, "sink",
GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (recvrtcp_udpsrc, "src", rtpbinreceive,
"recv_rtcp_sink_0", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
res =
gst_element_link_pads_full (rtpbinreceive, "send_rtcp_src_0",
recvrtcp_udpsink, "sink", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
g_signal_connect (bussend, "message::error", (GCallback) message_received,
binsend);
g_signal_connect (bussend, "message::warning", (GCallback) message_received,
binsend);
g_signal_connect (bussend, "message::eos", (GCallback) message_received,
binsend);
g_signal_connect (busreceive, "message::error", (GCallback) message_received,
binreceive);
g_signal_connect (busreceive, "message::warning",
(GCallback) message_received, binreceive);
g_signal_connect (busreceive, "message::eos", (GCallback) message_received,
binreceive);
state_res = gst_element_set_state (binreceive, GST_STATE_PLAYING);
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
state_res = gst_element_set_state (binsend, GST_STATE_PLAYING);
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
g_timeout_add (5000, on_timeout, binsend);
g_timeout_add (5000, on_timeout, binreceive);
GST_INFO ("enter mainloop");
while (!send_pipeline_eos && !receive_pipeline_eos)
g_main_context_iteration (NULL, TRUE);
GST_INFO ("exit mainloop");
/* check that FB NACK is working */
g_object_get (G_OBJECT (rtprtxsend), "num-rtx-requests", &nb_rtx_send_packets,
NULL);
g_object_get (G_OBJECT (rtprtxreceive), "num-rtx-requests",
&nb_rtx_recv_packets, NULL);
state_res = gst_element_set_state (binsend, GST_STATE_NULL);
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
state_res = gst_element_set_state (binreceive, GST_STATE_NULL);
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
GST_INFO ("nb_rtx_send_packets %d", nb_rtx_send_packets);
GST_INFO ("nb_rtx_recv_packets %d", nb_rtx_recv_packets);
fail_if (nb_rtx_send_packets < 1);
fail_if (nb_rtx_recv_packets < 1);
/* cleanup */
gst_bus_remove_signal_watch (bussend);
gst_object_unref (bussend);
gst_object_unref (binsend);
gst_bus_remove_signal_watch (busreceive);
gst_object_unref (busreceive);
gst_object_unref (binreceive);
}
GST_END_TEST;
static Suite *
rtpaux_suite (void)
{
Suite *s = suite_create ("rtpaux");
TCase *tc_chain = tcase_create ("general");
tcase_set_timeout (tc_chain, 10000);
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_simple_rtpbin_aux);
return s;
}
GST_CHECK_MAIN (rtpaux);
......@@ -70,7 +70,6 @@ good_tests = [
[ 'elements/rtph261' ],
[ 'elements/rtph263' ],
[ 'elements/rtpvp9' ],
[ 'elements/rtpaux' ],
[ 'elements/rtpbin' ],
[ 'elements/rtpbin_buffer_list' ],
[ 'elements/rtpbundle' ],
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment