From 15a3b0f6cee86b9c7cb7a697c7059bba42dba4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Mon, 30 May 2016 14:10:23 +0200 Subject: [PATCH] srtpenc: remove get-rollover-counter signal and add stats property We remove get-rollover-counter signal in favor of the "stats" property. The "stats" property is a GstStructure with caps application/x-srtp-encoder-stats that contains an array of structures with caps application/x-srtp-stream. Each stream structure contains "ssrc" and "roc" fields. https://bugzilla.gnome.org/show_bug.cgi?id=733265 --- ext/srtp/gstsrtpenc.c | 81 +++++++++++++++++++++++-------------------- ext/srtp/gstsrtpenc.h | 3 -- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/ext/srtp/gstsrtpenc.c b/ext/srtp/gstsrtpenc.c index 4e0296780f..7f46a4fda6 100644 --- a/ext/srtp/gstsrtpenc.c +++ b/ext/srtp/gstsrtpenc.c @@ -159,7 +159,8 @@ enum PROP_RTCP_AUTH, PROP_RANDOM_KEY, PROP_REPLAY_WINDOW_SIZE, - PROP_ALLOW_REPEAT_TX + PROP_ALLOW_REPEAT_TX, + PROP_STATS }; typedef struct ProcessBufferItData @@ -246,27 +247,6 @@ static GstPad *gst_srtp_enc_request_new_pad (GstElement * element, static void gst_srtp_enc_release_pad (GstElement * element, GstPad * pad); -static guint32 -gst_srtp_enc_get_rollover_counter (GstSrtpEnc * filter, guint32 ssrc) -{ - guint32 roc = 0; - srtp_stream_t stream; - - GST_OBJECT_LOCK (filter); - - GST_DEBUG_OBJECT (filter, "retrieving SRTP Rollover Counter, ssrc: %u", ssrc); - - if (filter->session) { - stream = srtp_get_stream (filter->session, htonl (ssrc)); - if (stream) - roc = stream->rtp_rdbx.index >> 16; - } - - GST_OBJECT_UNLOCK (filter); - - return roc; -} - /* initialize the srtpenc's class */ static void @@ -342,6 +322,9 @@ gst_srtp_enc_class_init (GstSrtpEncClass * klass) "(Note that such repeated transmissions must have the same RTP payload, " "or a severe security weakness is introduced!)", DEFAULT_ALLOW_REPEAT_TX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_STATS, + g_param_spec_boxed ("stats", "Statistics", "Various statistics", + GST_TYPE_STRUCTURE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * GstSrtpEnc::soft-limit: @@ -354,22 +337,6 @@ gst_srtp_enc_class_init (GstSrtpEncClass * klass) gst_srtp_enc_signals[SIGNAL_SOFT_LIMIT] = g_signal_new ("soft-limit", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); - - /** - * GstSrtpEnc::get-rollover-counter: - * @gstsrtpenc: the element on which the signal is emitted - * @ssrc: The unique SSRC of the stream - * - * Request the SRTP rollover counter for the stream with @ssrc. - */ - gst_srtp_enc_signals[SIGNAL_GET_ROLLOVER_COUNTER] = - g_signal_new ("get-rollover-counter", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstSrtpEncClass, - get_rollover_counter), NULL, NULL, g_cclosure_marshal_generic, - G_TYPE_UINT, 1, G_TYPE_UINT); - - klass->get_rollover_counter = - GST_DEBUG_FUNCPTR (gst_srtp_enc_get_rollover_counter); } @@ -633,6 +600,41 @@ gst_srtp_enc_dispose (GObject * object) G_OBJECT_CLASS (gst_srtp_enc_parent_class)->dispose (object); } +static GstStructure * +gst_srtp_enc_create_stats (GstSrtpEnc * filter) +{ + GstStructure *s; + GValue va = G_VALUE_INIT; + GValue v = G_VALUE_INIT; + + s = gst_structure_new_empty ("application/x-srtp-encoder-stats"); + + g_value_init (&va, GST_TYPE_ARRAY); + g_value_init (&v, GST_TYPE_STRUCTURE); + + if (filter->session) { + srtp_stream_t stream = filter->session->stream_list; + while (stream) { + GstStructure *ss; + guint32 ssrc = GUINT32_FROM_BE (stream->ssrc); + guint32 roc = stream->rtp_rdbx.index >> 16; + + ss = gst_structure_new ("application/x-srtp-stream", + "ssrc", G_TYPE_UINT, ssrc, "roc", G_TYPE_UINT, roc, NULL); + + g_value_take_boxed (&v, ss); + gst_value_array_append_value (&va, &v); + + stream = stream->next; + } + } + + gst_structure_take_value (s, "streams", &va); + g_value_unset (&v); + + return s; +} + static void gst_srtp_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -724,6 +726,9 @@ gst_srtp_enc_get_property (GObject * object, guint prop_id, case PROP_ALLOW_REPEAT_TX: g_value_set_boolean (value, filter->allow_repeat_tx); break; + case PROP_STATS: + g_value_take_boxed (value, gst_srtp_enc_create_stats (filter)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/ext/srtp/gstsrtpenc.h b/ext/srtp/gstsrtpenc.h index 843af1865a..842c56f54a 100644 --- a/ext/srtp/gstsrtpenc.h +++ b/ext/srtp/gstsrtpenc.h @@ -89,9 +89,6 @@ struct _GstSrtpEnc struct _GstSrtpEncClass { GstElementClass parent_class; - - /* action signals */ - guint32 (*get_rollover_counter) (GstSrtpEnc *encoder, guint32 ssrc); }; GType gst_srtp_enc_get_type (void);