summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosep Torra <n770galaxy@gmail.com>2016-05-30 14:10:23 +0200
committerJosep Torra <n770galaxy@gmail.com>2016-05-30 17:22:44 +0200
commit6767d74ba16c1dcfd404c2e0357d092b88e47ba0 (patch)
treebd0fcdc85d9aefccd5cbf0a8f1d8d05be811bdcc
parent0467923415893eb817994d252befac5d8c8d87c1 (diff)
srtpenc: remove get-rollover-counter signal and add stats propertysrtp
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
-rw-r--r--ext/srtp/gstsrtpenc.c82
-rw-r--r--ext/srtp/gstsrtpenc.h3
2 files changed, 44 insertions, 41 deletions
diff --git a/ext/srtp/gstsrtpenc.c b/ext/srtp/gstsrtpenc.c
index 4e0296780..cce432ef7 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,42 @@ 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 = 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_set_value (s, "streams", &va);
+ g_value_unset (&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 +727,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 843af1865..842c56f54 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);