ristrtpdeext: Expose the largest sequence number received

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153>
This commit is contained in:
Olivier Crête 2019-07-30 17:09:55 -04:00 committed by Olivier Crête
parent f2e8d4dcf2
commit d9512dc132
2 changed files with 46 additions and 9 deletions

View file

@ -47,6 +47,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_rist_rtp_deext_debug);
enum
{
PROP_0 = 0,
PROP_MAX_EXT_SEQNUM,
PROP_HAVE_EXT_SEQNUM
};
static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
@ -67,9 +69,7 @@ struct _GstRistRtpDeext
GstPad *srcpad, *sinkpad;
gboolean drop_null;
gboolean seqnumext;
gboolean have_extseqnum;
guint32 max_extseqnum;
};
@ -151,6 +151,8 @@ gst_rist_rtp_deext_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
num_packets_deleted = bit_count (npd_bits);
self->have_extseqnum = has_seqnum_ext;
if (has_seqnum_ext) {
guint16 seqnumext_val = GST_READ_UINT16_BE (data + 2);
guint32 extseqnum = seqnumext_val << 16 | gst_rtp_buffer_get_seq (&rtp);
@ -293,16 +295,21 @@ static void
gst_rist_rtp_deext_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
/* GstRistRtpDeext *self = GST_RIST_RTP_DEEXT (object); */
GstRistRtpDeext *self = GST_RIST_RTP_DEEXT (object);
switch (prop_id) {
case PROP_MAX_EXT_SEQNUM:
g_value_set_uint (value, self->max_extseqnum);
break;
case PROP_HAVE_EXT_SEQNUM:
g_value_set_boolean (value, self->have_extseqnum);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_rist_rtp_deext_class_init (GstRistRtpDeextClass * klass)
{
@ -310,11 +317,23 @@ gst_rist_rtp_deext_class_init (GstRistRtpDeextClass * klass)
GObjectClass *object_class = (GObjectClass *) klass;
gst_element_class_set_metadata (element_class,
"RIST RTP Eextension remover", "Filter/Network",
"RIST RTP Extension remover", "Filter/Network",
"Removes RIST TR-06-2 RTP Header extension",
"Olivier Crete <olivier.crete@collabora.com");
gst_element_class_add_static_pad_template (element_class, &src_templ);
gst_element_class_add_static_pad_template (element_class, &sink_templ);
object_class->get_property = gst_rist_rtp_deext_get_property;
g_object_class_install_property (object_class, PROP_MAX_EXT_SEQNUM,
g_param_spec_uint ("max-ext-seqnum",
"Maximum Extended Sequence Number",
"Largest extended sequence number received", 0, G_MAXUINT, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class, PROP_HAVE_EXT_SEQNUM,
g_param_spec_boolean ("have-ext-seqnum",
"Have extended seqnum",
"Has an extended sequence number extension been seen", FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
}

View file

@ -131,9 +131,9 @@ validate_ext (GstRTPBuffer * rtp, gboolean wanted_has_drop_null,
data = extdata;
has_drop_null = (data[0] >> 7) & 1; /* N */
has_seqnum_ext = (data[0] >> 6) & 1; /* E */
orig_ts_packet_count = (data[0] >> 3) & 7; /* Size */
has_drop_null = (data[0] >> 7) & 1; /* N */
has_seqnum_ext = (data[0] >> 6) & 1; /* E */
orig_ts_packet_count = (data[0] >> 3) & 7; /* Size */
ts_packet_size = ((data[1] >> 7) & 1) ? 204 : 188;
npd_bits = data[1] & 0x7F;
@ -983,6 +983,7 @@ GST_START_TEST (test_deext_seq_base)
GstHarness *h = gst_harness_new ("ristrtpdeext");
GstBuffer *ibuf, *obuf;
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
guint max_seqnum;
gst_harness_set_src_caps_str (h, "application/x-rtp, payload=33,"
"clock-rate=90000, encoding-name=MP2T");
@ -994,6 +995,9 @@ GST_START_TEST (test_deext_seq_base)
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (obuf);
g_object_get (h->element, "max-ext-seqnum", &max_seqnum, NULL);
fail_unless_equals_int (max_seqnum, 44);
ibuf = alloc_ts_buffer_with_ext (7, FALSE, TRUE, 7, 188, 0, 1);
obuf = gst_harness_push_and_pull (h, ibuf);
gst_rtp_buffer_map (obuf, GST_MAP_READ, &rtp);
@ -1001,6 +1005,9 @@ GST_START_TEST (test_deext_seq_base)
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (obuf);
g_object_get (h->element, "max-ext-seqnum", &max_seqnum, NULL);
fail_unless_equals_int (max_seqnum, 65536 + 44);
gst_harness_teardown (h);
}
@ -1011,6 +1018,7 @@ GST_START_TEST (test_deext_seq_drop)
GstHarness *h = gst_harness_new ("ristrtpdeext");
GstBuffer *ibuf, *obuf;
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
guint max_seqnum;
gst_harness_set_src_caps_str (h, "application/x-rtp, payload=33,"
"clock-rate=90000, encoding-name=MP2T");
@ -1022,6 +1030,10 @@ GST_START_TEST (test_deext_seq_drop)
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (obuf);
g_object_get (h->element, "max-ext-seqnum", &max_seqnum, NULL);
fail_unless_equals_int (max_seqnum, 44);
ibuf = alloc_ts_buffer_with_ext (7, FALSE, TRUE, 7, 188, 0, 2);
obuf = gst_harness_push_and_pull (h, ibuf);
gst_rtp_buffer_map (obuf, GST_MAP_READ, &rtp);
@ -1029,10 +1041,16 @@ GST_START_TEST (test_deext_seq_drop)
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (obuf);
g_object_get (h->element, "max-ext-seqnum", &max_seqnum, NULL);
fail_unless_equals_int (max_seqnum, 65536 + 65536 + 44);
ibuf = alloc_ts_buffer_with_ext (7, FALSE, TRUE, 7, 188, 0, 0);
fail_unless_equals_int (gst_harness_push (h, ibuf), GST_FLOW_OK);
fail_unless_equals_int (gst_harness_buffers_in_queue (h), 0);
g_object_get (h->element, "max-ext-seqnum", &max_seqnum, NULL);
fail_unless_equals_int (max_seqnum, 65536 + 65536 + 44);
gst_harness_teardown (h);
}