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
This commit is contained in:
Aleix Conchillo Flaqué 2016-05-30 14:10:23 +02:00 committed by Josep Torra
parent a0876aa750
commit 15a3b0f6ce
2 changed files with 43 additions and 41 deletions

View file

@ -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;

View file

@ -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);