mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 00:01:23 +00:00
dtls: Re-namespace from Er to Gst
This commit is contained in:
parent
1de51fcf02
commit
936fa2f1c4
20 changed files with 620 additions and 643 deletions
|
@ -39,17 +39,17 @@
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
#if ER_DTLS_USE_GST_LOG
|
#if GST_DTLS_USE_GST_LOG
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_agent_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_agent_debug);
|
||||||
# define GST_CAT_DEFAULT er_dtls_agent_debug
|
# define GST_CAT_DEFAULT gst_dtls_agent_debug
|
||||||
G_DEFINE_TYPE_WITH_CODE (ErDtlsAgent, er_dtls_agent, G_TYPE_OBJECT,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsAgent, gst_dtls_agent, G_TYPE_OBJECT,
|
||||||
GST_DEBUG_CATEGORY_INIT (er_dtls_agent_debug, "gstdtlsagent", 0,
|
GST_DEBUG_CATEGORY_INIT (gst_dtls_agent_debug, "dtlsagent", 0,
|
||||||
"Ericsson DTLS Agent"));
|
"DTLS Agent"));
|
||||||
#else
|
#else
|
||||||
G_DEFINE_TYPE (ErDtlsAgent, er_dtls_agent, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (GstDtlsAgent, gst_dtls_agent, G_TYPE_OBJECT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ER_DTLS_AGENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), ER_TYPE_DTLS_AGENT, ErDtlsAgentPrivate))
|
#define GST_DTLS_AGENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GST_TYPE_DTLS_AGENT, GstDtlsAgentPrivate))
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -60,17 +60,17 @@ enum
|
||||||
|
|
||||||
static GParamSpec *properties[NUM_PROPERTIES];
|
static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
|
|
||||||
struct _ErDtlsAgentPrivate
|
struct _GstDtlsAgentPrivate
|
||||||
{
|
{
|
||||||
SSL_CTX *ssl_context;
|
SSL_CTX *ssl_context;
|
||||||
|
|
||||||
ErDtlsCertificate *certificate;
|
GstDtlsCertificate *certificate;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void er_dtls_agent_finalize (GObject * gobject);
|
static void gst_dtls_agent_finalize (GObject * gobject);
|
||||||
static void er_dtls_agent_set_property (GObject *, guint prop_id,
|
static void gst_dtls_agent_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
const gchar *er_dtls_agent_peek_id (ErDtlsAgent *);
|
const gchar *gst_dtls_agent_peek_id (GstDtlsAgent *);
|
||||||
|
|
||||||
static GRWLock *ssl_locks;
|
static GRWLock *ssl_locks;
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ ssl_thread_id_function (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_er_dtls_init_openssl ()
|
_gst_dtls_init_openssl ()
|
||||||
{
|
{
|
||||||
static gsize is_init = 0;
|
static gsize is_init = 0;
|
||||||
gint i;
|
gint i;
|
||||||
|
@ -142,31 +142,31 @@ _er_dtls_init_openssl ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_agent_class_init (ErDtlsAgentClass * klass)
|
gst_dtls_agent_class_init (GstDtlsAgentClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ErDtlsAgentPrivate));
|
g_type_class_add_private (klass, sizeof (GstDtlsAgentPrivate));
|
||||||
|
|
||||||
gobject_class->set_property = er_dtls_agent_set_property;
|
gobject_class->set_property = gst_dtls_agent_set_property;
|
||||||
gobject_class->finalize = er_dtls_agent_finalize;
|
gobject_class->finalize = gst_dtls_agent_finalize;
|
||||||
|
|
||||||
properties[PROP_CERTIFICATE] =
|
properties[PROP_CERTIFICATE] =
|
||||||
g_param_spec_object ("certificate",
|
g_param_spec_object ("certificate",
|
||||||
"ErDtlsCertificate",
|
"GstDtlsCertificate",
|
||||||
"Sets the certificate of the agent",
|
"Sets the certificate of the agent",
|
||||||
ER_TYPE_DTLS_CERTIFICATE,
|
GST_TYPE_DTLS_CERTIFICATE,
|
||||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
||||||
|
|
||||||
_er_dtls_init_openssl ();
|
_gst_dtls_init_openssl ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_agent_init (ErDtlsAgent * self)
|
gst_dtls_agent_init (GstDtlsAgent * self)
|
||||||
{
|
{
|
||||||
ErDtlsAgentPrivate *priv = ER_DTLS_AGENT_GET_PRIVATE (self);
|
GstDtlsAgentPrivate *priv = GST_DTLS_AGENT_GET_PRIVATE (self);
|
||||||
self->priv = priv;
|
self->priv = priv;
|
||||||
|
|
||||||
ERR_clear_error ();
|
ERR_clear_error ();
|
||||||
|
@ -194,42 +194,42 @@ er_dtls_agent_init (ErDtlsAgent * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_agent_finalize (GObject * gobject)
|
gst_dtls_agent_finalize (GObject * gobject)
|
||||||
{
|
{
|
||||||
ErDtlsAgentPrivate *priv = ER_DTLS_AGENT (gobject)->priv;
|
GstDtlsAgentPrivate *priv = GST_DTLS_AGENT (gobject)->priv;
|
||||||
|
|
||||||
SSL_CTX_free (priv->ssl_context);
|
SSL_CTX_free (priv->ssl_context);
|
||||||
priv->ssl_context = NULL;
|
priv->ssl_context = NULL;
|
||||||
|
|
||||||
LOG_DEBUG (gobject, "finalized");
|
LOG_DEBUG (gobject, "finalized");
|
||||||
|
|
||||||
G_OBJECT_CLASS (er_dtls_agent_parent_class)->finalize (gobject);
|
G_OBJECT_CLASS (gst_dtls_agent_parent_class)->finalize (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_agent_set_property (GObject * object, guint prop_id,
|
gst_dtls_agent_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
ErDtlsAgent *self = ER_DTLS_AGENT (object);
|
GstDtlsAgent *self = GST_DTLS_AGENT (object);
|
||||||
ErDtlsCertificate *certificate;
|
GstDtlsCertificate *certificate;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CERTIFICATE:
|
case PROP_CERTIFICATE:
|
||||||
certificate = ER_DTLS_CERTIFICATE (g_value_get_object (value));
|
certificate = GST_DTLS_CERTIFICATE (g_value_get_object (value));
|
||||||
g_return_if_fail (ER_IS_DTLS_CERTIFICATE (certificate));
|
g_return_if_fail (GST_IS_DTLS_CERTIFICATE (certificate));
|
||||||
g_return_if_fail (self->priv->ssl_context);
|
g_return_if_fail (self->priv->ssl_context);
|
||||||
|
|
||||||
self->priv->certificate = certificate;
|
self->priv->certificate = certificate;
|
||||||
g_object_ref (certificate);
|
g_object_ref (certificate);
|
||||||
|
|
||||||
if (!SSL_CTX_use_certificate (self->priv->ssl_context,
|
if (!SSL_CTX_use_certificate (self->priv->ssl_context,
|
||||||
_er_dtls_certificate_get_internal_certificate (certificate))) {
|
_gst_dtls_certificate_get_internal_certificate (certificate))) {
|
||||||
LOG_WARNING (self, "could not use certificate");
|
LOG_WARNING (self, "could not use certificate");
|
||||||
g_return_if_reached ();
|
g_return_if_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SSL_CTX_use_PrivateKey (self->priv->ssl_context,
|
if (!SSL_CTX_use_PrivateKey (self->priv->ssl_context,
|
||||||
_er_dtls_certificate_get_internal_key (certificate))) {
|
_gst_dtls_certificate_get_internal_key (certificate))) {
|
||||||
LOG_WARNING (self, "could not use private key");
|
LOG_WARNING (self, "could not use private key");
|
||||||
g_return_if_reached ();
|
g_return_if_reached ();
|
||||||
}
|
}
|
||||||
|
@ -244,10 +244,10 @@ er_dtls_agent_set_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ErDtlsCertificate *
|
GstDtlsCertificate *
|
||||||
er_dtls_agent_get_certificate (ErDtlsAgent * self)
|
gst_dtls_agent_get_certificate (GstDtlsAgent * self)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_AGENT (self), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_AGENT (self), NULL);
|
||||||
if (self->priv->certificate) {
|
if (self->priv->certificate) {
|
||||||
g_object_ref (self->priv->certificate);
|
g_object_ref (self->priv->certificate);
|
||||||
}
|
}
|
||||||
|
@ -255,20 +255,21 @@ er_dtls_agent_get_certificate (ErDtlsAgent * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar *
|
gchar *
|
||||||
er_dtls_agent_get_certificate_pem (ErDtlsAgent * self)
|
gst_dtls_agent_get_certificate_pem (GstDtlsAgent * self)
|
||||||
{
|
{
|
||||||
gchar *pem;
|
gchar *pem;
|
||||||
g_return_val_if_fail (ER_IS_DTLS_AGENT (self), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_AGENT (self), NULL);
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CERTIFICATE (self->priv->certificate), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_CERTIFICATE (self->priv->certificate),
|
||||||
|
NULL);
|
||||||
|
|
||||||
g_object_get (self->priv->certificate, "pem", &pem, NULL);
|
g_object_get (self->priv->certificate, "pem", &pem, NULL);
|
||||||
|
|
||||||
return pem;
|
return pem;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ErDtlsAgentContext
|
const GstDtlsAgentContext
|
||||||
_er_dtls_agent_peek_context (ErDtlsAgent * self)
|
_gst_dtls_agent_peek_context (GstDtlsAgent * self)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_AGENT (self), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_AGENT (self), NULL);
|
||||||
return self->priv->ssl_context;
|
return self->priv->ssl_context;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,50 +32,50 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define ER_TYPE_DTLS_AGENT (er_dtls_agent_get_type())
|
#define GST_TYPE_DTLS_AGENT (gst_dtls_agent_get_type())
|
||||||
#define ER_DTLS_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), ER_TYPE_DTLS_AGENT, ErDtlsAgent))
|
#define GST_DTLS_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_AGENT, GstDtlsAgent))
|
||||||
#define ER_DTLS_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), ER_TYPE_DTLS_AGENT, ErDtlsAgentClass))
|
#define GST_DTLS_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_AGENT, GstDtlsAgentClass))
|
||||||
#define ER_IS_DTLS_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), ER_TYPE_DTLS_AGENT))
|
#define GST_IS_DTLS_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_AGENT))
|
||||||
#define ER_IS_DTLS_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), ER_TYPE_DTLS_AGENT))
|
#define GST_IS_DTLS_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_AGENT))
|
||||||
#define ER_DTLS_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ER_TYPE_DTLS_AGENT, ErDtlsAgentClass))
|
#define GST_DTLS_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DTLS_AGENT, GstDtlsAgentClass))
|
||||||
|
|
||||||
typedef gpointer ErDtlsAgentContext;
|
typedef gpointer GstDtlsAgentContext;
|
||||||
|
|
||||||
typedef struct _ErDtlsAgent ErDtlsAgent;
|
typedef struct _GstDtlsAgent GstDtlsAgent;
|
||||||
typedef struct _ErDtlsAgentClass ErDtlsAgentClass;
|
typedef struct _GstDtlsAgentClass GstDtlsAgentClass;
|
||||||
typedef struct _ErDtlsAgentPrivate ErDtlsAgentPrivate;
|
typedef struct _GstDtlsAgentPrivate GstDtlsAgentPrivate;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ErDtlsAgent:
|
* GstDtlsAgent:
|
||||||
*
|
*
|
||||||
* A context for creating ErDtlsConnections with a ErDtlsCertificate.
|
* A context for creating GstDtlsConnections with a GstDtlsCertificate.
|
||||||
* ErDtlsAgent needs to be constructed with the "certificate" property set.
|
* GstDtlsAgent needs to be constructed with the "certificate" property set.
|
||||||
*/
|
*/
|
||||||
struct _ErDtlsAgent {
|
struct _GstDtlsAgent {
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
ErDtlsAgentPrivate *priv;
|
GstDtlsAgentPrivate *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ErDtlsAgentClass {
|
struct _GstDtlsAgentClass {
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType er_dtls_agent_get_type(void) G_GNUC_CONST;
|
GType gst_dtls_agent_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the certificate used by the agent.
|
* Returns the certificate used by the agent.
|
||||||
*/
|
*/
|
||||||
ErDtlsCertificate *er_dtls_agent_get_certificate(ErDtlsAgent *);
|
GstDtlsCertificate *gst_dtls_agent_get_certificate(GstDtlsAgent *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the certificate used by the agent, in PEM format.
|
* Returns the certificate used by the agent, in PEM format.
|
||||||
*/
|
*/
|
||||||
gchar *er_dtls_agent_get_certificate_pem(ErDtlsAgent *self);
|
gchar *gst_dtls_agent_get_certificate_pem(GstDtlsAgent *self);
|
||||||
|
|
||||||
/* internal */
|
/* internal */
|
||||||
void _er_dtls_init_openssl(void);
|
void _gst_dtls_init_openssl(void);
|
||||||
const ErDtlsAgentContext _er_dtls_agent_peek_context(ErDtlsAgent *);
|
const GstDtlsAgentContext _gst_dtls_agent_peek_context(GstDtlsAgent *);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -39,17 +39,17 @@
|
||||||
|
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
#if ER_DTLS_USE_GST_LOG
|
#if GST_DTLS_USE_GST_LOG
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_certificate_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_certificate_debug);
|
||||||
# define GST_CAT_DEFAULT er_dtls_certificate_debug
|
# define GST_CAT_DEFAULT gst_dtls_certificate_debug
|
||||||
G_DEFINE_TYPE_WITH_CODE (ErDtlsCertificate, er_dtls_certificate, G_TYPE_OBJECT,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsCertificate, gst_dtls_certificate,
|
||||||
GST_DEBUG_CATEGORY_INIT (er_dtls_certificate_debug, "gstdtlscertificate", 0,
|
G_TYPE_OBJECT, GST_DEBUG_CATEGORY_INIT (gst_dtls_certificate_debug,
|
||||||
"Ericsson DTLS Certificate"));
|
"dtlscertificate", 0, "DTLS Certificate"));
|
||||||
#else
|
#else
|
||||||
G_DEFINE_TYPE (ErDtlsCertificate, er_dtls_certificate, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (GstDtlsCertificate, gst_dtls_certificate, G_TYPE_OBJECT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ER_DTLS_CERTIFICATE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), ER_TYPE_DTLS_CERTIFICATE, ErDtlsCertificatePrivate))
|
#define GST_DTLS_CERTIFICATE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GST_TYPE_DTLS_CERTIFICATE, GstDtlsCertificatePrivate))
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -62,7 +62,7 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
|
|
||||||
#define DEFAULT_PEM NULL
|
#define DEFAULT_PEM NULL
|
||||||
|
|
||||||
struct _ErDtlsCertificatePrivate
|
struct _GstDtlsCertificatePrivate
|
||||||
{
|
{
|
||||||
X509 *x509;
|
X509 *x509;
|
||||||
EVP_PKEY *private_key;
|
EVP_PKEY *private_key;
|
||||||
|
@ -70,24 +70,24 @@ struct _ErDtlsCertificatePrivate
|
||||||
gchar *pem;
|
gchar *pem;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void er_dtls_certificate_finalize (GObject * gobject);
|
static void gst_dtls_certificate_finalize (GObject * gobject);
|
||||||
static void er_dtls_certificate_set_property (GObject *, guint prop_id,
|
static void gst_dtls_certificate_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void er_dtls_certificate_get_property (GObject *, guint prop_id,
|
static void gst_dtls_certificate_get_property (GObject *, guint prop_id,
|
||||||
GValue *, GParamSpec *);
|
GValue *, GParamSpec *);
|
||||||
|
|
||||||
static void init_generated (ErDtlsCertificate *);
|
static void init_generated (GstDtlsCertificate *);
|
||||||
static void init_from_pem_string (ErDtlsCertificate *, const gchar * pem);
|
static void init_from_pem_string (GstDtlsCertificate *, const gchar * pem);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_certificate_class_init (ErDtlsCertificateClass * klass)
|
gst_dtls_certificate_class_init (GstDtlsCertificateClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ErDtlsCertificatePrivate));
|
g_type_class_add_private (klass, sizeof (GstDtlsCertificatePrivate));
|
||||||
|
|
||||||
gobject_class->set_property = er_dtls_certificate_set_property;
|
gobject_class->set_property = gst_dtls_certificate_set_property;
|
||||||
gobject_class->get_property = er_dtls_certificate_get_property;
|
gobject_class->get_property = gst_dtls_certificate_get_property;
|
||||||
|
|
||||||
properties[PROP_PEM] =
|
properties[PROP_PEM] =
|
||||||
g_param_spec_string ("pem",
|
g_param_spec_string ("pem",
|
||||||
|
@ -98,15 +98,15 @@ er_dtls_certificate_class_init (ErDtlsCertificateClass * klass)
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
||||||
|
|
||||||
_er_dtls_init_openssl ();
|
_gst_dtls_init_openssl ();
|
||||||
|
|
||||||
gobject_class->finalize = er_dtls_certificate_finalize;
|
gobject_class->finalize = gst_dtls_certificate_finalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_certificate_init (ErDtlsCertificate * self)
|
gst_dtls_certificate_init (GstDtlsCertificate * self)
|
||||||
{
|
{
|
||||||
ErDtlsCertificatePrivate *priv = ER_DTLS_CERTIFICATE_GET_PRIVATE (self);
|
GstDtlsCertificatePrivate *priv = GST_DTLS_CERTIFICATE_GET_PRIVATE (self);
|
||||||
self->priv = priv;
|
self->priv = priv;
|
||||||
|
|
||||||
priv->x509 = NULL;
|
priv->x509 = NULL;
|
||||||
|
@ -115,9 +115,9 @@ er_dtls_certificate_init (ErDtlsCertificate * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_certificate_finalize (GObject * gobject)
|
gst_dtls_certificate_finalize (GObject * gobject)
|
||||||
{
|
{
|
||||||
ErDtlsCertificatePrivate *priv = ER_DTLS_CERTIFICATE (gobject)->priv;
|
GstDtlsCertificatePrivate *priv = GST_DTLS_CERTIFICATE (gobject)->priv;
|
||||||
|
|
||||||
X509_free (priv->x509);
|
X509_free (priv->x509);
|
||||||
priv->x509 = NULL;
|
priv->x509 = NULL;
|
||||||
|
@ -129,14 +129,14 @@ er_dtls_certificate_finalize (GObject * gobject)
|
||||||
g_free (priv->pem);
|
g_free (priv->pem);
|
||||||
priv->pem = NULL;
|
priv->pem = NULL;
|
||||||
|
|
||||||
G_OBJECT_CLASS (er_dtls_certificate_parent_class)->finalize (gobject);
|
G_OBJECT_CLASS (gst_dtls_certificate_parent_class)->finalize (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_certificate_set_property (GObject * object, guint prop_id,
|
gst_dtls_certificate_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
ErDtlsCertificate *self = ER_DTLS_CERTIFICATE (object);
|
GstDtlsCertificate *self = GST_DTLS_CERTIFICATE (object);
|
||||||
const gchar *pem;
|
const gchar *pem;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
@ -154,10 +154,10 @@ er_dtls_certificate_set_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_certificate_get_property (GObject * object, guint prop_id,
|
gst_dtls_certificate_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec)
|
GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
ErDtlsCertificate *self = ER_DTLS_CERTIFICATE (object);
|
GstDtlsCertificate *self = GST_DTLS_CERTIFICATE (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_PEM:
|
case PROP_PEM:
|
||||||
|
@ -170,9 +170,9 @@ er_dtls_certificate_get_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_generated (ErDtlsCertificate * self)
|
init_generated (GstDtlsCertificate * self)
|
||||||
{
|
{
|
||||||
ErDtlsCertificatePrivate *priv = self->priv;
|
GstDtlsCertificatePrivate *priv = self->priv;
|
||||||
RSA *rsa;
|
RSA *rsa;
|
||||||
X509_NAME *name = NULL;
|
X509_NAME *name = NULL;
|
||||||
|
|
||||||
|
@ -240,13 +240,13 @@ init_generated (ErDtlsCertificate * self)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->priv->pem = _er_dtls_x509_to_pem (priv->x509);
|
self->priv->pem = _gst_dtls_x509_to_pem (priv->x509);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_from_pem_string (ErDtlsCertificate * self, const gchar * pem)
|
init_from_pem_string (GstDtlsCertificate * self, const gchar * pem)
|
||||||
{
|
{
|
||||||
ErDtlsCertificatePrivate *priv = self->priv;
|
GstDtlsCertificatePrivate *priv = self->priv;
|
||||||
BIO *bio;
|
BIO *bio;
|
||||||
|
|
||||||
g_return_if_fail (pem);
|
g_return_if_fail (pem);
|
||||||
|
@ -281,11 +281,11 @@ init_from_pem_string (ErDtlsCertificate * self, const gchar * pem)
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar *
|
gchar *
|
||||||
_er_dtls_x509_to_pem (gpointer x509)
|
_gst_dtls_x509_to_pem (gpointer x509)
|
||||||
{
|
{
|
||||||
#define ER_DTLS_BIO_BUFFER_SIZE 4096
|
#define GST_DTLS_BIO_BUFFER_SIZE 4096
|
||||||
BIO *bio;
|
BIO *bio;
|
||||||
gchar buffer[ER_DTLS_BIO_BUFFER_SIZE] = { 0 };
|
gchar buffer[GST_DTLS_BIO_BUFFER_SIZE] = { 0 };
|
||||||
gint len;
|
gint len;
|
||||||
gchar *pem = NULL;
|
gchar *pem = NULL;
|
||||||
|
|
||||||
|
@ -297,7 +297,7 @@ _er_dtls_x509_to_pem (gpointer x509)
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = BIO_read (bio, buffer, ER_DTLS_BIO_BUFFER_SIZE);
|
len = BIO_read (bio, buffer, GST_DTLS_BIO_BUFFER_SIZE);
|
||||||
if (!len) {
|
if (!len) {
|
||||||
g_warn_if_reached ();
|
g_warn_if_reached ();
|
||||||
goto beach;
|
goto beach;
|
||||||
|
@ -311,16 +311,16 @@ beach:
|
||||||
return pem;
|
return pem;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErDtlsCertificateInternalCertificate
|
GstDtlsCertificateInternalCertificate
|
||||||
_er_dtls_certificate_get_internal_certificate (ErDtlsCertificate * self)
|
_gst_dtls_certificate_get_internal_certificate (GstDtlsCertificate * self)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CERTIFICATE (self), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_CERTIFICATE (self), NULL);
|
||||||
return self->priv->x509;
|
return self->priv->x509;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErDtlsCertificateInternalKey
|
GstDtlsCertificateInternalKey
|
||||||
_er_dtls_certificate_get_internal_key (ErDtlsCertificate * self)
|
_gst_dtls_certificate_get_internal_key (GstDtlsCertificate * self)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CERTIFICATE (self), NULL);
|
g_return_val_if_fail (GST_IS_DTLS_CERTIFICATE (self), NULL);
|
||||||
return self->priv->private_key;
|
return self->priv->private_key;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,42 +30,42 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define ER_TYPE_DTLS_CERTIFICATE (er_dtls_certificate_get_type())
|
#define GST_TYPE_DTLS_CERTIFICATE (gst_dtls_certificate_get_type())
|
||||||
#define ER_DTLS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), ER_TYPE_DTLS_CERTIFICATE, ErDtlsCertificate))
|
#define GST_DTLS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_CERTIFICATE, GstDtlsCertificate))
|
||||||
#define ER_DTLS_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), ER_TYPE_DTLS_CERTIFICATE, ErDtlsCertificateClass))
|
#define GST_DTLS_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_CERTIFICATE, GstDtlsCertificateClass))
|
||||||
#define ER_IS_DTLS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), ER_TYPE_DTLS_CERTIFICATE))
|
#define GST_IS_DTLS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_CERTIFICATE))
|
||||||
#define ER_IS_DTLS_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), ER_TYPE_DTLS_CERTIFICATE))
|
#define GST_IS_DTLS_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_CERTIFICATE))
|
||||||
#define ER_DTLS_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ER_TYPE_DTLS_CERTIFICATE, ErDtlsCertificateClass))
|
#define GST_DTLS_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DTLS_CERTIFICATE, GstDtlsCertificateClass))
|
||||||
|
|
||||||
typedef gpointer ErDtlsCertificateInternalCertificate;
|
typedef gpointer GstDtlsCertificateInternalCertificate;
|
||||||
typedef gpointer ErDtlsCertificateInternalKey;
|
typedef gpointer GstDtlsCertificateInternalKey;
|
||||||
|
|
||||||
typedef struct _ErDtlsCertificate ErDtlsCertificate;
|
typedef struct _GstDtlsCertificate GstDtlsCertificate;
|
||||||
typedef struct _ErDtlsCertificateClass ErDtlsCertificateClass;
|
typedef struct _GstDtlsCertificateClass GstDtlsCertificateClass;
|
||||||
typedef struct _ErDtlsCertificatePrivate ErDtlsCertificatePrivate;
|
typedef struct _GstDtlsCertificatePrivate GstDtlsCertificatePrivate;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ErDtlsCertificate:
|
* GstDtlsCertificate:
|
||||||
*
|
*
|
||||||
* Handles a X509 certificate and a private key.
|
* Handles a X509 certificate and a private key.
|
||||||
* If a certificate is created without the "pem" property, a self-signed certificate is generated.
|
* If a certificate is created without the "pem" property, a self-signed certificate is generated.
|
||||||
*/
|
*/
|
||||||
struct _ErDtlsCertificate {
|
struct _GstDtlsCertificate {
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
ErDtlsCertificatePrivate *priv;
|
GstDtlsCertificatePrivate *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ErDtlsCertificateClass {
|
struct _GstDtlsCertificateClass {
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType er_dtls_certificate_get_type(void) G_GNUC_CONST;
|
GType gst_dtls_certificate_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
/* internal */
|
/* internal */
|
||||||
ErDtlsCertificateInternalCertificate _er_dtls_certificate_get_internal_certificate(ErDtlsCertificate *);
|
GstDtlsCertificateInternalCertificate _gst_dtls_certificate_get_internal_certificate(GstDtlsCertificate *);
|
||||||
ErDtlsCertificateInternalKey _er_dtls_certificate_get_internal_key(ErDtlsCertificate *);
|
GstDtlsCertificateInternalKey _gst_dtls_certificate_get_internal_key(GstDtlsCertificate *);
|
||||||
gchar *_er_dtls_x509_to_pem(gpointer x509);
|
gchar *_gst_dtls_x509_to_pem(gpointer x509);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,11 @@
|
||||||
#ifndef gstdtlscommon_h
|
#ifndef gstdtlscommon_h
|
||||||
#define gstdtlscommon_h
|
#define gstdtlscommon_h
|
||||||
|
|
||||||
#ifndef ER_DTLS_USE_GST_LOG
|
#ifndef GST_DTLS_USE_GST_LOG
|
||||||
# define ER_DTLS_USE_GST_LOG 0
|
# define GST_DTLS_USE_GST_LOG 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ER_DTLS_USE_GST_LOG
|
#if GST_DTLS_USE_GST_LOG
|
||||||
# include <gst/gst.h>
|
# include <gst/gst.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ G_BEGIN_DECLS
|
||||||
|
|
||||||
#define UNUSED(param) while (0) { (void)(param); }
|
#define UNUSED(param) while (0) { (void)(param); }
|
||||||
|
|
||||||
#if ER_DTLS_USE_GST_LOG
|
#if GST_DTLS_USE_GST_LOG
|
||||||
# define LOG_ERROR(obj, ...) GST_ERROR_OBJECT(obj, __VA_ARGS__ )
|
# define LOG_ERROR(obj, ...) GST_ERROR_OBJECT(obj, __VA_ARGS__ )
|
||||||
# define LOG_WARNING(obj, ...) GST_WARNING_OBJECT(obj, __VA_ARGS__ )
|
# define LOG_WARNING(obj, ...) GST_WARNING_OBJECT(obj, __VA_ARGS__ )
|
||||||
# define LOG_FIXME(obj, ...) GST_FIXME_OBJECT(obj, __VA_ARGS__ )
|
# define LOG_FIXME(obj, ...) GST_FIXME_OBJECT(obj, __VA_ARGS__ )
|
||||||
|
|
|
@ -41,17 +41,17 @@
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
#if ER_DTLS_USE_GST_LOG
|
#if GST_DTLS_USE_GST_LOG
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_connection_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_connection_debug);
|
||||||
# define GST_CAT_DEFAULT er_dtls_connection_debug
|
# define GST_CAT_DEFAULT gst_dtls_connection_debug
|
||||||
G_DEFINE_TYPE_WITH_CODE (ErDtlsConnection, er_dtls_connection, G_TYPE_OBJECT,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsConnection, gst_dtls_connection, G_TYPE_OBJECT,
|
||||||
GST_DEBUG_CATEGORY_INIT (er_dtls_connection_debug, "gstdtlsconnection", 0,
|
GST_DEBUG_CATEGORY_INIT (gst_dtls_connection_debug, "dtlsconnection", 0,
|
||||||
"Ericsson DTLS Connection"));
|
"DTLS Connection"));
|
||||||
#else
|
#else
|
||||||
G_DEFINE_TYPE (ErDtlsConnection, er_dtls_connection, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (GstDtlsConnection, gst_dtls_connection, G_TYPE_OBJECT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ER_DTLS_CONNECTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), ER_TYPE_DTLS_CONNECTION, ErDtlsConnectionPrivate))
|
#define GST_DTLS_CONNECTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GST_TYPE_DTLS_CONNECTION, GstDtlsConnectionPrivate))
|
||||||
|
|
||||||
#define SRTP_KEY_LEN 16
|
#define SRTP_KEY_LEN 16
|
||||||
#define SRTP_SALT_LEN 14
|
#define SRTP_SALT_LEN 14
|
||||||
|
@ -77,7 +77,7 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
|
|
||||||
static int connection_ex_index;
|
static int connection_ex_index;
|
||||||
|
|
||||||
struct _ErDtlsConnectionPrivate
|
struct _GstDtlsConnectionPrivate
|
||||||
{
|
{
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
BIO *bio;
|
BIO *bio;
|
||||||
|
@ -97,18 +97,18 @@ struct _ErDtlsConnectionPrivate
|
||||||
GClosure *send_closure;
|
GClosure *send_closure;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void er_dtls_connection_finalize (GObject * gobject);
|
static void gst_dtls_connection_finalize (GObject * gobject);
|
||||||
static void er_dtls_connection_set_property (GObject *, guint prop_id,
|
static void gst_dtls_connection_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
|
|
||||||
static void log_state (ErDtlsConnection *, const gchar * str);
|
static void log_state (GstDtlsConnection *, const gchar * str);
|
||||||
static gpointer connection_timeout_thread_func (ErDtlsConnection *);
|
static gpointer connection_timeout_thread_func (GstDtlsConnection *);
|
||||||
static void export_srtp_keys (ErDtlsConnection *);
|
static void export_srtp_keys (GstDtlsConnection *);
|
||||||
static void openssl_poll (ErDtlsConnection *);
|
static void openssl_poll (GstDtlsConnection *);
|
||||||
static int openssl_verify_callback (int preverify_ok,
|
static int openssl_verify_callback (int preverify_ok,
|
||||||
X509_STORE_CTX * x509_ctx);
|
X509_STORE_CTX * x509_ctx);
|
||||||
|
|
||||||
static BIO_METHOD *BIO_s_er_dtls_connection ();
|
static BIO_METHOD *BIO_s_gst_dtls_connection ();
|
||||||
static int bio_method_write (BIO *, const char *data, int size);
|
static int bio_method_write (BIO *, const char *data, int size);
|
||||||
static int bio_method_read (BIO *, char *out_buffer, int size);
|
static int bio_method_read (BIO *, char *out_buffer, int size);
|
||||||
static long bio_method_ctrl (BIO *, int cmd, long arg1, void *arg2);
|
static long bio_method_ctrl (BIO *, int cmd, long arg1, void *arg2);
|
||||||
|
@ -116,13 +116,13 @@ static int bio_method_new (BIO *);
|
||||||
static int bio_method_free (BIO *);
|
static int bio_method_free (BIO *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_connection_class_init (ErDtlsConnectionClass * klass)
|
gst_dtls_connection_class_init (GstDtlsConnectionClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ErDtlsConnectionPrivate));
|
g_type_class_add_private (klass, sizeof (GstDtlsConnectionPrivate));
|
||||||
|
|
||||||
gobject_class->set_property = er_dtls_connection_set_property;
|
gobject_class->set_property = gst_dtls_connection_set_property;
|
||||||
|
|
||||||
connection_ex_index =
|
connection_ex_index =
|
||||||
SSL_get_ex_new_index (0, (gpointer) "gstdtlsagent connection index", NULL,
|
SSL_get_ex_new_index (0, (gpointer) "gstdtlsagent connection index", NULL,
|
||||||
|
@ -147,22 +147,22 @@ er_dtls_connection_class_init (ErDtlsConnectionClass * klass)
|
||||||
|
|
||||||
properties[PROP_AGENT] =
|
properties[PROP_AGENT] =
|
||||||
g_param_spec_object ("agent",
|
g_param_spec_object ("agent",
|
||||||
"ERDtlsAgent",
|
"DTLS Agent",
|
||||||
"Agent to use in creation of the connection",
|
"Agent to use in creation of the connection",
|
||||||
ER_TYPE_DTLS_AGENT,
|
GST_TYPE_DTLS_AGENT,
|
||||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
||||||
|
|
||||||
_er_dtls_init_openssl ();
|
_gst_dtls_init_openssl ();
|
||||||
|
|
||||||
gobject_class->finalize = er_dtls_connection_finalize;
|
gobject_class->finalize = gst_dtls_connection_finalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_connection_init (ErDtlsConnection * self)
|
gst_dtls_connection_init (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
ErDtlsConnectionPrivate *priv = ER_DTLS_CONNECTION_GET_PRIVATE (self);
|
GstDtlsConnectionPrivate *priv = GST_DTLS_CONNECTION_GET_PRIVATE (self);
|
||||||
self->priv = priv;
|
self->priv = priv;
|
||||||
|
|
||||||
priv->ssl = NULL;
|
priv->ssl = NULL;
|
||||||
|
@ -185,10 +185,10 @@ er_dtls_connection_init (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_connection_finalize (GObject * gobject)
|
gst_dtls_connection_finalize (GObject * gobject)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self = ER_DTLS_CONNECTION (gobject);
|
GstDtlsConnection *self = GST_DTLS_CONNECTION (gobject);
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
|
||||||
SSL_free (priv->ssl);
|
SSL_free (priv->ssl);
|
||||||
|
@ -204,30 +204,30 @@ er_dtls_connection_finalize (GObject * gobject)
|
||||||
|
|
||||||
LOG_DEBUG (self, "finalized");
|
LOG_DEBUG (self, "finalized");
|
||||||
|
|
||||||
G_OBJECT_CLASS (er_dtls_connection_parent_class)->finalize (gobject);
|
G_OBJECT_CLASS (gst_dtls_connection_parent_class)->finalize (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
er_dtls_connection_set_property (GObject * object, guint prop_id,
|
gst_dtls_connection_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self = ER_DTLS_CONNECTION (object);
|
GstDtlsConnection *self = GST_DTLS_CONNECTION (object);
|
||||||
ErDtlsAgent *agent;
|
GstDtlsAgent *agent;
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
SSL_CTX *ssl_context;
|
SSL_CTX *ssl_context;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_AGENT:
|
case PROP_AGENT:
|
||||||
g_return_if_fail (!priv->ssl);
|
g_return_if_fail (!priv->ssl);
|
||||||
agent = ER_DTLS_AGENT (g_value_get_object (value));
|
agent = GST_DTLS_AGENT (g_value_get_object (value));
|
||||||
g_return_if_fail (ER_IS_DTLS_AGENT (agent));
|
g_return_if_fail (GST_IS_DTLS_AGENT (agent));
|
||||||
|
|
||||||
ssl_context = _er_dtls_agent_peek_context (agent);
|
ssl_context = _gst_dtls_agent_peek_context (agent);
|
||||||
|
|
||||||
priv->ssl = SSL_new (ssl_context);
|
priv->ssl = SSL_new (ssl_context);
|
||||||
g_return_if_fail (priv->ssl);
|
g_return_if_fail (priv->ssl);
|
||||||
|
|
||||||
priv->bio = BIO_new (BIO_s_er_dtls_connection ());
|
priv->bio = BIO_new (BIO_s_gst_dtls_connection ());
|
||||||
g_return_if_fail (priv->bio);
|
g_return_if_fail (priv->bio);
|
||||||
|
|
||||||
priv->bio->ptr = self;
|
priv->bio->ptr = self;
|
||||||
|
@ -246,10 +246,10 @@ er_dtls_connection_set_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
er_dtls_connection_start (ErDtlsConnection * self, gboolean is_client)
|
gst_dtls_connection_start (GstDtlsConnection * self, gboolean is_client)
|
||||||
{
|
{
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (self));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (self));
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
g_return_if_fail (priv->send_closure);
|
g_return_if_fail (priv->send_closure);
|
||||||
g_return_if_fail (priv->ssl);
|
g_return_if_fail (priv->ssl);
|
||||||
g_return_if_fail (priv->bio);
|
g_return_if_fail (priv->bio);
|
||||||
|
@ -283,11 +283,11 @@ er_dtls_connection_start (ErDtlsConnection * self, gboolean is_client)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
er_dtls_connection_start_timeout (ErDtlsConnection * self)
|
gst_dtls_connection_start_timeout (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (self));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (self));
|
||||||
|
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
gchar *thread_name = g_strdup_printf ("connection_thread_%p", self);
|
gchar *thread_name = g_strdup_printf ("connection_thread_%p", self);
|
||||||
|
|
||||||
|
@ -311,9 +311,9 @@ er_dtls_connection_start_timeout (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
er_dtls_connection_stop (ErDtlsConnection * self)
|
gst_dtls_connection_stop (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (self));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (self));
|
||||||
g_return_if_fail (self->priv->ssl);
|
g_return_if_fail (self->priv->ssl);
|
||||||
g_return_if_fail (self->priv->bio);
|
g_return_if_fail (self->priv->bio);
|
||||||
|
|
||||||
|
@ -335,9 +335,9 @@ er_dtls_connection_stop (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
er_dtls_connection_close (ErDtlsConnection * self)
|
gst_dtls_connection_close (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (self));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (self));
|
||||||
g_return_if_fail (self->priv->ssl);
|
g_return_if_fail (self->priv->ssl);
|
||||||
g_return_if_fail (self->priv->bio);
|
g_return_if_fail (self->priv->bio);
|
||||||
|
|
||||||
|
@ -364,10 +364,10 @@ er_dtls_connection_close (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
er_dtls_connection_set_send_callback (ErDtlsConnection * self,
|
gst_dtls_connection_set_send_callback (GstDtlsConnection * self,
|
||||||
GClosure * closure)
|
GClosure * closure)
|
||||||
{
|
{
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (self));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (self));
|
||||||
|
|
||||||
LOG_TRACE (self, "locking @ set_send_callback");
|
LOG_TRACE (self, "locking @ set_send_callback");
|
||||||
g_mutex_lock (&self->priv->mutex);
|
g_mutex_lock (&self->priv->mutex);
|
||||||
|
@ -384,10 +384,10 @@ er_dtls_connection_set_send_callback (ErDtlsConnection * self,
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
er_dtls_connection_process (ErDtlsConnection * self, gpointer data, gint len)
|
gst_dtls_connection_process (GstDtlsConnection * self, gpointer data, gint len)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CONNECTION (self), 0);
|
g_return_val_if_fail (GST_IS_DTLS_CONNECTION (self), 0);
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
gint result;
|
gint result;
|
||||||
|
|
||||||
g_return_val_if_fail (self->priv->ssl, 0);
|
g_return_val_if_fail (self->priv->ssl, 0);
|
||||||
|
@ -427,9 +427,9 @@ er_dtls_connection_process (ErDtlsConnection * self, gpointer data, gint len)
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
er_dtls_connection_send (ErDtlsConnection * self, gpointer data, gint len)
|
gst_dtls_connection_send (GstDtlsConnection * self, gpointer data, gint len)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CONNECTION (self), 0);
|
g_return_val_if_fail (GST_IS_DTLS_CONNECTION (self), 0);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (self->priv->ssl, 0);
|
g_return_val_if_fail (self->priv->ssl, 0);
|
||||||
|
@ -464,9 +464,9 @@ er_dtls_connection_send (ErDtlsConnection * self, gpointer data, gint len)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
log_state (ErDtlsConnection * self, const gchar * str)
|
log_state (GstDtlsConnection * self, const gchar * str)
|
||||||
{
|
{
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
guint states = 0;
|
guint states = 0;
|
||||||
|
|
||||||
states |= (! !SSL_is_init_finished (priv->ssl) << 0);
|
states |= (! !SSL_is_init_finished (priv->ssl) << 0);
|
||||||
|
@ -488,9 +488,9 @@ log_state (ErDtlsConnection * self, const gchar * str)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
connection_timeout_thread_func (ErDtlsConnection * self)
|
connection_timeout_thread_func (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
gint64 end_time, wait_time;
|
gint64 end_time, wait_time;
|
||||||
gint ret;
|
gint ret;
|
||||||
|
@ -551,7 +551,7 @@ connection_timeout_thread_func (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
export_srtp_keys (ErDtlsConnection * self)
|
export_srtp_keys (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -566,20 +566,20 @@ export_srtp_keys (ErDtlsConnection * self)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Key client_key;
|
Key client_key;
|
||||||
Key server_key;
|
Key servgst_key;
|
||||||
Salt client_salt;
|
Salt client_salt;
|
||||||
Salt server_salt;
|
Salt servgst_salt;
|
||||||
} exported_keys;
|
} exported_keys;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Key key;
|
Key key;
|
||||||
Salt salt;
|
Salt salt;
|
||||||
} client_key, server_key;
|
} client_key, servgst_key;
|
||||||
|
|
||||||
SRTP_PROTECTION_PROFILE *profile;
|
SRTP_PROTECTION_PROFILE *profile;
|
||||||
ErDtlsSrtpCipher cipher;
|
GstDtlsSrtpCipher cipher;
|
||||||
ErDtlsSrtpAuth auth;
|
GstDtlsSrtpAuth auth;
|
||||||
gint success;
|
gint success;
|
||||||
|
|
||||||
static gchar export_string[] = "EXTRACTOR-dtls_srtp";
|
static gchar export_string[] = "EXTRACTOR-dtls_srtp";
|
||||||
|
@ -599,12 +599,12 @@ export_srtp_keys (ErDtlsConnection * self)
|
||||||
|
|
||||||
switch (profile->id) {
|
switch (profile->id) {
|
||||||
case SRTP_AES128_CM_SHA1_80:
|
case SRTP_AES128_CM_SHA1_80:
|
||||||
cipher = ER_DTLS_SRTP_CIPHER_AES_128_ICM;
|
cipher = GST_DTLS_SRTP_CIPHER_AES_128_ICM;
|
||||||
auth = ER_DTLS_SRTP_AUTH_HMAC_SHA1_80;
|
auth = GST_DTLS_SRTP_AUTH_HMAC_SHA1_80;
|
||||||
break;
|
break;
|
||||||
case SRTP_AES128_CM_SHA1_32:
|
case SRTP_AES128_CM_SHA1_32:
|
||||||
cipher = ER_DTLS_SRTP_CIPHER_AES_128_ICM;
|
cipher = GST_DTLS_SRTP_CIPHER_AES_128_ICM;
|
||||||
auth = ER_DTLS_SRTP_AUTH_HMAC_SHA1_32;
|
auth = GST_DTLS_SRTP_AUTH_HMAC_SHA1_32;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_WARNING (self, "invalid crypto suite set by handshake");
|
LOG_WARNING (self, "invalid crypto suite set by handshake");
|
||||||
|
@ -612,18 +612,18 @@ export_srtp_keys (ErDtlsConnection * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
client_key.key = exported_keys.client_key;
|
client_key.key = exported_keys.client_key;
|
||||||
server_key.key = exported_keys.server_key;
|
servgst_key.key = exported_keys.servgst_key;
|
||||||
client_key.salt = exported_keys.client_salt;
|
client_key.salt = exported_keys.client_salt;
|
||||||
server_key.salt = exported_keys.server_salt;
|
servgst_key.salt = exported_keys.servgst_salt;
|
||||||
|
|
||||||
if (self->priv->is_client) {
|
if (self->priv->is_client) {
|
||||||
g_signal_emit (self, signals[SIGNAL_ON_ENCODER_KEY], 0, &client_key, cipher,
|
g_signal_emit (self, signals[SIGNAL_ON_ENCODER_KEY], 0, &client_key, cipher,
|
||||||
auth);
|
auth);
|
||||||
g_signal_emit (self, signals[SIGNAL_ON_DECODER_KEY], 0, &server_key, cipher,
|
g_signal_emit (self, signals[SIGNAL_ON_DECODER_KEY], 0, &servgst_key,
|
||||||
auth);
|
cipher, auth);
|
||||||
} else {
|
} else {
|
||||||
g_signal_emit (self, signals[SIGNAL_ON_ENCODER_KEY], 0, &server_key, cipher,
|
g_signal_emit (self, signals[SIGNAL_ON_ENCODER_KEY], 0, &servgst_key,
|
||||||
auth);
|
cipher, auth);
|
||||||
g_signal_emit (self, signals[SIGNAL_ON_DECODER_KEY], 0, &client_key, cipher,
|
g_signal_emit (self, signals[SIGNAL_ON_DECODER_KEY], 0, &client_key, cipher,
|
||||||
auth);
|
auth);
|
||||||
}
|
}
|
||||||
|
@ -633,7 +633,7 @@ beach:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
openssl_poll (ErDtlsConnection * self)
|
openssl_poll (GstDtlsConnection * self)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
|
@ -691,7 +691,7 @@ openssl_poll (ErDtlsConnection * self)
|
||||||
static int
|
static int
|
||||||
openssl_verify_callback (int preverify_ok, X509_STORE_CTX * x509_ctx)
|
openssl_verify_callback (int preverify_ok, X509_STORE_CTX * x509_ctx)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self;
|
GstDtlsConnection *self;
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
BIO *bio;
|
BIO *bio;
|
||||||
gchar *pem = NULL;
|
gchar *pem = NULL;
|
||||||
|
@ -701,9 +701,9 @@ openssl_verify_callback (int preverify_ok, X509_STORE_CTX * x509_ctx)
|
||||||
X509_STORE_CTX_get_ex_data (x509_ctx,
|
X509_STORE_CTX_get_ex_data (x509_ctx,
|
||||||
SSL_get_ex_data_X509_STORE_CTX_idx ());
|
SSL_get_ex_data_X509_STORE_CTX_idx ());
|
||||||
self = SSL_get_ex_data (ssl, connection_ex_index);
|
self = SSL_get_ex_data (ssl, connection_ex_index);
|
||||||
g_return_val_if_fail (ER_IS_DTLS_CONNECTION (self), FALSE);
|
g_return_val_if_fail (GST_IS_DTLS_CONNECTION (self), FALSE);
|
||||||
|
|
||||||
pem = _er_dtls_x509_to_pem (x509_ctx->cert);
|
pem = _gst_dtls_x509_to_pem (x509_ctx->cert);
|
||||||
|
|
||||||
if (!pem) {
|
if (!pem) {
|
||||||
LOG_WARNING (self, "failed to convert received certificate to pem format");
|
LOG_WARNING (self, "failed to convert received certificate to pem format");
|
||||||
|
@ -756,7 +756,7 @@ static BIO_METHOD custom_bio_methods = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static BIO_METHOD *
|
static BIO_METHOD *
|
||||||
BIO_s_er_dtls_connection ()
|
BIO_s_gst_dtls_connection ()
|
||||||
{
|
{
|
||||||
return &custom_bio_methods;
|
return &custom_bio_methods;
|
||||||
}
|
}
|
||||||
|
@ -764,14 +764,14 @@ BIO_s_er_dtls_connection ()
|
||||||
static int
|
static int
|
||||||
bio_method_write (BIO * bio, const char *data, int size)
|
bio_method_write (BIO * bio, const char *data, int size)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self = ER_DTLS_CONNECTION (bio->ptr);
|
GstDtlsConnection *self = GST_DTLS_CONNECTION (bio->ptr);
|
||||||
|
|
||||||
LOG_LOG (self, "BIO: writing %d", size);
|
LOG_LOG (self, "BIO: writing %d", size);
|
||||||
|
|
||||||
if (self->priv->send_closure) {
|
if (self->priv->send_closure) {
|
||||||
GValue values[3] = { G_VALUE_INIT };
|
GValue values[3] = { G_VALUE_INIT };
|
||||||
|
|
||||||
g_value_init (&values[0], ER_TYPE_DTLS_CONNECTION);
|
g_value_init (&values[0], GST_TYPE_DTLS_CONNECTION);
|
||||||
g_value_set_object (&values[0], self);
|
g_value_set_object (&values[0], self);
|
||||||
|
|
||||||
g_value_init (&values[1], G_TYPE_POINTER);
|
g_value_init (&values[1], G_TYPE_POINTER);
|
||||||
|
@ -789,8 +789,8 @@ bio_method_write (BIO * bio, const char *data, int size)
|
||||||
static int
|
static int
|
||||||
bio_method_read (BIO * bio, char *out_buffer, int size)
|
bio_method_read (BIO * bio, char *out_buffer, int size)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self = ER_DTLS_CONNECTION (bio->ptr);
|
GstDtlsConnection *self = GST_DTLS_CONNECTION (bio->ptr);
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
guint internal_size;
|
guint internal_size;
|
||||||
gint copy_size;
|
gint copy_size;
|
||||||
|
|
||||||
|
@ -833,8 +833,8 @@ bio_method_read (BIO * bio, char *out_buffer, int size)
|
||||||
static long
|
static long
|
||||||
bio_method_ctrl (BIO * bio, int cmd, long arg1, void *arg2)
|
bio_method_ctrl (BIO * bio, int cmd, long arg1, void *arg2)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *self = ER_DTLS_CONNECTION (bio->ptr);
|
GstDtlsConnection *self = GST_DTLS_CONNECTION (bio->ptr);
|
||||||
ErDtlsConnectionPrivate *priv = self->priv;
|
GstDtlsConnectionPrivate *priv = self->priv;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
|
case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
|
||||||
|
@ -896,6 +896,6 @@ bio_method_free (BIO * bio)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_LOG (ER_DTLS_CONNECTION (bio->ptr), "BIO free");
|
LOG_LOG (GST_DTLS_CONNECTION (bio->ptr), "BIO free");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,93 +30,93 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define ER_TYPE_DTLS_CONNECTION (er_dtls_connection_get_type())
|
#define GST_TYPE_DTLS_CONNECTION (gst_dtls_connection_get_type())
|
||||||
#define ER_DTLS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), ER_TYPE_DTLS_CONNECTION, ErDtlsConnection))
|
#define GST_DTLS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_CONNECTION, GstDtlsConnection))
|
||||||
#define ER_DTLS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), ER_TYPE_DTLS_CONNECTION, ErDtlsConnectionClass))
|
#define GST_DTLS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_CONNECTION, GstDtlsConnectionClass))
|
||||||
#define ER_IS_DTLS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), ER_TYPE_DTLS_CONNECTION))
|
#define GST_IS_DTLS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_CONNECTION))
|
||||||
#define ER_IS_DTLS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), ER_TYPE_DTLS_CONNECTION))
|
#define GST_IS_DTLS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_CONNECTION))
|
||||||
#define ER_DTLS_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ER_TYPE_DTLS_CONNECTION, ErDtlsConnectionClass))
|
#define GST_DTLS_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DTLS_CONNECTION, GstDtlsConnectionClass))
|
||||||
|
|
||||||
typedef struct _ErDtlsConnection ErDtlsConnection;
|
typedef struct _GstDtlsConnection GstDtlsConnection;
|
||||||
typedef struct _ErDtlsConnectionClass ErDtlsConnectionClass;
|
typedef struct _GstDtlsConnectionClass GstDtlsConnectionClass;
|
||||||
typedef struct _ErDtlsConnectionPrivate ErDtlsConnectionPrivate;
|
typedef struct _GstDtlsConnectionPrivate GstDtlsConnectionPrivate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ErDtlsSrtpCipher:
|
* GstDtlsSrtpCipher:
|
||||||
* @ER_DTLS_SRTP_CIPHER_AES_128_ICM: aes-128-icm
|
* @GST_DTLS_SRTP_CIPHER_AES_128_ICM: aes-128-icm
|
||||||
*
|
*
|
||||||
* SRTP Cipher selected by the DTLS handshake, should match the enums in gstsrtp
|
* SRTP Cipher selected by the DTLS handshake, should match the enums in gstsrtp
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ER_DTLS_SRTP_CIPHER_AES_128_ICM = 1
|
GST_DTLS_SRTP_CIPHER_AES_128_ICM = 1
|
||||||
} ErDtlsSrtpCipher;
|
} GstDtlsSrtpCipher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ErDtlsSrtpAuth:
|
* GstDtlsSrtpAuth:
|
||||||
* @ER_DTLS_SRTP_AUTH_HMAC_SHA1_32: hmac-sha1-32
|
* @GST_DTLS_SRTP_AUTH_HMAC_SHA1_32: hmac-sha1-32
|
||||||
* @ER_DTLS_SRTP_AUTH_HMAC_SHA1_80: hmac-sha1-80
|
* @GST_DTLS_SRTP_AUTH_HMAC_SHA1_80: hmac-sha1-80
|
||||||
*
|
*
|
||||||
* SRTP Auth selected by the DTLS handshake, should match the enums in gstsrtp
|
* SRTP Auth selected by the DTLS handshake, should match the enums in gstsrtp
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ER_DTLS_SRTP_AUTH_HMAC_SHA1_32 = 1,
|
GST_DTLS_SRTP_AUTH_HMAC_SHA1_32 = 1,
|
||||||
ER_DTLS_SRTP_AUTH_HMAC_SHA1_80 = 2
|
GST_DTLS_SRTP_AUTH_HMAC_SHA1_80 = 2
|
||||||
} ErDtlsSrtpAuth;
|
} GstDtlsSrtpAuth;
|
||||||
|
|
||||||
#define ER_DTLS_SRTP_MASTER_KEY_LENGTH 30
|
#define GST_DTLS_SRTP_MASTER_KEY_LENGTH 30
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ErDtlsConnection:
|
* GstDtlsConnection:
|
||||||
*
|
*
|
||||||
* A class that handles a single DTLS connection.
|
* A class that handles a single DTLS connection.
|
||||||
* Any connection needs to be created with the agent property set.
|
* Any connection needs to be created with the agent property set.
|
||||||
* Once the DTLS handshake is completed, on-encoder-key and on-decoder-key will be signalled.
|
* Once the DTLS handshake is completed, on-encoder-key and on-decoder-key will be signalled.
|
||||||
*/
|
*/
|
||||||
struct _ErDtlsConnection {
|
struct _GstDtlsConnection {
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
ErDtlsConnectionPrivate *priv;
|
GstDtlsConnectionPrivate *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ErDtlsConnectionClass {
|
struct _GstDtlsConnectionClass {
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType er_dtls_connection_get_type(void) G_GNUC_CONST;
|
GType gst_dtls_connection_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
void er_dtls_connection_start(ErDtlsConnection *, gboolean is_client);
|
void gst_dtls_connection_start(GstDtlsConnection *, gboolean is_client);
|
||||||
void er_dtls_connection_start_timeout(ErDtlsConnection *);
|
void gst_dtls_connection_start_timeout(GstDtlsConnection *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stops the connections, it is not required to call this function.
|
* Stops the connections, it is not required to call this function.
|
||||||
*/
|
*/
|
||||||
void er_dtls_connection_stop(ErDtlsConnection *);
|
void gst_dtls_connection_stop(GstDtlsConnection *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Closes the connection, the function will block until the connection has been stopped.
|
* Closes the connection, the function will block until the connection has been stopped.
|
||||||
* If stop is called some time before, close will return instantly.
|
* If stop is called some time before, close will return instantly.
|
||||||
*/
|
*/
|
||||||
void er_dtls_connection_close(ErDtlsConnection *);
|
void gst_dtls_connection_close(GstDtlsConnection *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the closure that will be called whenever data needs to be sent.
|
* Sets the closure that will be called whenever data needs to be sent.
|
||||||
*
|
*
|
||||||
* The closure will get called with the following arguments:
|
* The closure will get called with the following arguments:
|
||||||
* void cb(ErDtlsConnection *, gpointer data, gint length, gpointer user_data)
|
* void cb(GstDtlsConnection *, gpointer data, gint length, gpointer usgst_data)
|
||||||
*/
|
*/
|
||||||
void er_dtls_connection_set_send_callback(ErDtlsConnection *, GClosure *);
|
void gst_dtls_connection_set_send_callback(GstDtlsConnection *, GClosure *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Processes data that has been recevied, the transformation is done in-place.
|
* Processes data that has been recevied, the transformation is done in-place.
|
||||||
* Returns the length of the plaintext data that was decoded, if no data is available, 0<= will be returned.
|
* Returns the length of the plaintext data that was decoded, if no data is available, 0<= will be returned.
|
||||||
*/
|
*/
|
||||||
gint er_dtls_connection_process(ErDtlsConnection *, gpointer ptr, gint len);
|
gint gst_dtls_connection_process(GstDtlsConnection *, gpointer ptr, gint len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the DTLS handshake is completed this function will encode the given data.
|
* If the DTLS handshake is completed this function will encode the given data.
|
||||||
* Returns the length of the data sent, or 0 if the DTLS handshake is not completed.
|
* Returns the length of the data sent, or 0 if the DTLS handshake is not completed.
|
||||||
*/
|
*/
|
||||||
gint er_dtls_connection_send(ErDtlsConnection *, gpointer ptr, gint len);
|
gint gst_dtls_connection_send(GstDtlsConnection *, gpointer ptr, gint len);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -42,13 +42,12 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_PAD_REQUEST,
|
GST_PAD_REQUEST,
|
||||||
GST_STATIC_CAPS_ANY);
|
GST_STATIC_CAPS_ANY);
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_dec_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_dec_debug);
|
||||||
#define GST_CAT_DEFAULT er_dtls_dec_debug
|
#define GST_CAT_DEFAULT gst_dtls_dec_debug
|
||||||
|
|
||||||
#define gst_er_dtls_dec_parent_class parent_class
|
#define gst_dtls_dec_parent_class parent_class
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstErDtlsDec, gst_er_dtls_dec, GST_TYPE_ELEMENT,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsDec, gst_dtls_dec, GST_TYPE_ELEMENT,
|
||||||
GST_DEBUG_CATEGORY_INIT (er_dtls_dec_debug, "erdtlsdec", 0,
|
GST_DEBUG_CATEGORY_INIT (gst_dtls_dec_debug, "dtlsdec", 0, "DTLS Decoder"));
|
||||||
"Ericsson DTLS Decoder"));
|
|
||||||
|
|
||||||
#define UNUSED(param) while (0) { (void)(param); }
|
#define UNUSED(param) while (0) { (void)(param); }
|
||||||
|
|
||||||
|
@ -84,32 +83,32 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
#define DEFAULT_SRTP_AUTH 0
|
#define DEFAULT_SRTP_AUTH 0
|
||||||
|
|
||||||
|
|
||||||
static void gst_er_dtls_dec_finalize (GObject *);
|
static void gst_dtls_dec_finalize (GObject *);
|
||||||
static void gst_er_dtls_dec_dispose (GObject *);
|
static void gst_dtls_dec_dispose (GObject *);
|
||||||
static void gst_er_dtls_dec_set_property (GObject *, guint prop_id,
|
static void gst_dtls_dec_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void gst_er_dtls_dec_get_property (GObject *, guint prop_id, GValue *,
|
static void gst_dtls_dec_get_property (GObject *, guint prop_id, GValue *,
|
||||||
GParamSpec *);
|
GParamSpec *);
|
||||||
|
|
||||||
static GstStateChangeReturn gst_er_dtls_dec_change_state (GstElement *,
|
static GstStateChangeReturn gst_dtls_dec_change_state (GstElement *,
|
||||||
GstStateChange);
|
GstStateChange);
|
||||||
static GstPad *gst_er_dtls_dec_request_new_pad (GstElement *, GstPadTemplate *,
|
static GstPad *gst_dtls_dec_request_new_pad (GstElement *, GstPadTemplate *,
|
||||||
const gchar * name, const GstCaps *);
|
const gchar * name, const GstCaps *);
|
||||||
static void gst_er_dtls_dec_release_pad (GstElement *, GstPad *);
|
static void gst_dtls_dec_release_pad (GstElement *, GstPad *);
|
||||||
|
|
||||||
static void on_key_received (ErDtlsConnection *, gpointer key, guint cipher,
|
static void on_key_received (GstDtlsConnection *, gpointer key, guint cipher,
|
||||||
guint auth, GstErDtlsDec *);
|
guint auth, GstDtlsDec *);
|
||||||
static gboolean on_peer_certificate_received (ErDtlsConnection *, gchar * pem,
|
static gboolean on_pegst_certificate_received (GstDtlsConnection *, gchar * pem,
|
||||||
GstErDtlsDec *);
|
GstDtlsDec *);
|
||||||
static GstFlowReturn sink_chain (GstPad *, GstObject * parent, GstBuffer *);
|
static GstFlowReturn sink_chain (GstPad *, GstObject * parent, GstBuffer *);
|
||||||
|
|
||||||
static ErDtlsAgent *get_agent_by_pem (const gchar * pem);
|
static GstDtlsAgent *get_agent_by_pem (const gchar * pem);
|
||||||
static void agent_weak_ref_notify (gchar * pem, ErDtlsAgent *);
|
static void agent_weak_ref_notify (gchar * pem, GstDtlsAgent *);
|
||||||
static void create_connection (GstErDtlsDec *, gchar * id);
|
static void create_connection (GstDtlsDec *, gchar * id);
|
||||||
static void connection_weak_ref_notify (gchar * id, ErDtlsConnection *);
|
static void connection_weak_ref_notify (gchar * id, GstDtlsConnection *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_class_init (GstErDtlsDecClass * klass)
|
gst_dtls_dec_class_init (GstDtlsDecClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
|
@ -117,18 +116,15 @@ gst_er_dtls_dec_class_init (GstErDtlsDecClass * klass)
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
element_class = (GstElementClass *) klass;
|
element_class = (GstElementClass *) klass;
|
||||||
|
|
||||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_er_dtls_dec_finalize);
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_dtls_dec_finalize);
|
||||||
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_er_dtls_dec_dispose);
|
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_dtls_dec_dispose);
|
||||||
gobject_class->set_property =
|
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_dtls_dec_set_property);
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_dec_set_property);
|
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_dtls_dec_get_property);
|
||||||
gobject_class->get_property =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_dec_get_property);
|
|
||||||
|
|
||||||
element_class->change_state =
|
element_class->change_state = GST_DEBUG_FUNCPTR (gst_dtls_dec_change_state);
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_dec_change_state);
|
|
||||||
element_class->request_new_pad =
|
element_class->request_new_pad =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_dec_request_new_pad);
|
GST_DEBUG_FUNCPTR (gst_dtls_dec_request_new_pad);
|
||||||
element_class->release_pad = GST_DEBUG_FUNCPTR (gst_er_dtls_dec_release_pad);
|
element_class->release_pad = GST_DEBUG_FUNCPTR (gst_dtls_dec_release_pad);
|
||||||
|
|
||||||
signals[SIGNAL_ON_KEY_RECEIVED] =
|
signals[SIGNAL_ON_KEY_RECEIVED] =
|
||||||
g_signal_new ("on-key-received", G_TYPE_FROM_CLASS (klass),
|
g_signal_new ("on-key-received", G_TYPE_FROM_CLASS (klass),
|
||||||
|
@ -163,16 +159,16 @@ gst_er_dtls_dec_class_init (GstErDtlsDecClass * klass)
|
||||||
g_param_spec_uint ("srtp-cipher",
|
g_param_spec_uint ("srtp-cipher",
|
||||||
"SRTP cipher",
|
"SRTP cipher",
|
||||||
"The SRTP cipher selected in the DTLS handshake. "
|
"The SRTP cipher selected in the DTLS handshake. "
|
||||||
"The value will be set to an ErDtlsSrtpCipher.",
|
"The value will be set to an GstDtlsSrtpCipher.",
|
||||||
0, ER_DTLS_SRTP_CIPHER_AES_128_ICM, DEFAULT_SRTP_CIPHER,
|
0, GST_DTLS_SRTP_CIPHER_AES_128_ICM, DEFAULT_SRTP_CIPHER,
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
properties[PROP_SRTP_AUTH] =
|
properties[PROP_SRTP_AUTH] =
|
||||||
g_param_spec_uint ("srtp-auth",
|
g_param_spec_uint ("srtp-auth",
|
||||||
"SRTP authentication",
|
"SRTP authentication",
|
||||||
"The SRTP authentication selected in the DTLS handshake. "
|
"The SRTP authentication selected in the DTLS handshake. "
|
||||||
"The value will be set to an ErDtlsSrtpAuth.",
|
"The value will be set to an GstDtlsSrtpAuth.",
|
||||||
0, ER_DTLS_SRTP_AUTH_HMAC_SHA1_80, DEFAULT_SRTP_AUTH,
|
0, GST_DTLS_SRTP_AUTH_HMAC_SHA1_80, DEFAULT_SRTP_AUTH,
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
||||||
|
@ -189,15 +185,15 @@ gst_er_dtls_dec_class_init (GstErDtlsDecClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_init (GstErDtlsDec * self)
|
gst_dtls_dec_init (GstDtlsDec * self)
|
||||||
{
|
{
|
||||||
GstPad *sink;
|
GstPad *sink;
|
||||||
self->agent = get_agent_by_pem (NULL);
|
self->agent = get_agent_by_pem (NULL);
|
||||||
self->connection_id = NULL;
|
self->connection_id = NULL;
|
||||||
self->connection = NULL;
|
self->connection = NULL;
|
||||||
self->peer_pem = NULL;
|
self->pegst_pem = NULL;
|
||||||
|
|
||||||
self->decoder_key = NULL;
|
self->decodgst_key = NULL;
|
||||||
self->srtp_cipher = DEFAULT_SRTP_CIPHER;
|
self->srtp_cipher = DEFAULT_SRTP_CIPHER;
|
||||||
self->srtp_auth = DEFAULT_SRTP_AUTH;
|
self->srtp_auth = DEFAULT_SRTP_AUTH;
|
||||||
|
|
||||||
|
@ -213,20 +209,20 @@ gst_er_dtls_dec_init (GstErDtlsDec * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_finalize (GObject * object)
|
gst_dtls_dec_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (object);
|
GstDtlsDec *self = GST_DTLS_DEC (object);
|
||||||
|
|
||||||
if (self->decoder_key) {
|
if (self->decodgst_key) {
|
||||||
gst_buffer_unref (self->decoder_key);
|
gst_buffer_unref (self->decodgst_key);
|
||||||
self->decoder_key = NULL;
|
self->decodgst_key = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (self->connection_id);
|
g_free (self->connection_id);
|
||||||
self->connection_id = NULL;
|
self->connection_id = NULL;
|
||||||
|
|
||||||
g_free (self->peer_pem);
|
g_free (self->pegst_pem);
|
||||||
self->peer_pem = NULL;
|
self->pegst_pem = NULL;
|
||||||
|
|
||||||
g_mutex_clear (&self->src_mutex);
|
g_mutex_clear (&self->src_mutex);
|
||||||
|
|
||||||
|
@ -236,9 +232,9 @@ gst_er_dtls_dec_finalize (GObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_dispose (GObject * object)
|
gst_dtls_dec_dispose (GObject * object)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (object);
|
GstDtlsDec *self = GST_DTLS_DEC (object);
|
||||||
|
|
||||||
if (self->agent) {
|
if (self->agent) {
|
||||||
g_object_unref (self->agent);
|
g_object_unref (self->agent);
|
||||||
|
@ -252,10 +248,10 @@ gst_er_dtls_dec_dispose (GObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_set_property (GObject * object, guint prop_id,
|
gst_dtls_dec_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (object);
|
GstDtlsDec *self = GST_DTLS_DEC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
@ -279,10 +275,10 @@ gst_er_dtls_dec_set_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_get_property (GObject * object, guint prop_id, GValue * value,
|
gst_dtls_dec_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
GParamSpec * pspec)
|
GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (object);
|
GstDtlsDec *self = GST_DTLS_DEC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
@ -290,13 +286,13 @@ gst_er_dtls_dec_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
break;
|
break;
|
||||||
case PROP_PEM:
|
case PROP_PEM:
|
||||||
g_value_take_string (value,
|
g_value_take_string (value,
|
||||||
er_dtls_agent_get_certificate_pem (self->agent));
|
gst_dtls_agent_get_certificate_pem (self->agent));
|
||||||
break;
|
break;
|
||||||
case PROP_PEER_PEM:
|
case PROP_PEER_PEM:
|
||||||
g_value_set_string (value, self->peer_pem);
|
g_value_set_string (value, self->pegst_pem);
|
||||||
break;
|
break;
|
||||||
case PROP_DECODER_KEY:
|
case PROP_DECODER_KEY:
|
||||||
g_value_set_boxed (value, self->decoder_key);
|
g_value_set_boxed (value, self->decodgst_key);
|
||||||
break;
|
break;
|
||||||
case PROP_SRTP_CIPHER:
|
case PROP_SRTP_CIPHER:
|
||||||
g_value_set_uint (value, self->srtp_cipher);
|
g_value_set_uint (value, self->srtp_cipher);
|
||||||
|
@ -310,9 +306,9 @@ gst_er_dtls_dec_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_er_dtls_dec_change_state (GstElement * element, GstStateChange transition)
|
gst_dtls_dec_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (element);
|
GstDtlsDec *self = GST_DTLS_DEC (element);
|
||||||
GstStateChangeReturn ret;
|
GstStateChangeReturn ret;
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
|
@ -321,7 +317,7 @@ gst_er_dtls_dec_change_state (GstElement * element, GstStateChange transition)
|
||||||
g_signal_connect_object (self->connection,
|
g_signal_connect_object (self->connection,
|
||||||
"on-decoder-key", G_CALLBACK (on_key_received), self, 0);
|
"on-decoder-key", G_CALLBACK (on_key_received), self, 0);
|
||||||
g_signal_connect_object (self->connection,
|
g_signal_connect_object (self->connection,
|
||||||
"on-peer-certificate", G_CALLBACK (on_peer_certificate_received),
|
"on-peer-certificate", G_CALLBACK (on_pegst_certificate_received),
|
||||||
self, 0);
|
self, 0);
|
||||||
} else {
|
} else {
|
||||||
GST_WARNING_OBJECT (self,
|
GST_WARNING_OBJECT (self,
|
||||||
|
@ -339,10 +335,10 @@ gst_er_dtls_dec_change_state (GstElement * element, GstStateChange transition)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPad *
|
static GstPad *
|
||||||
gst_er_dtls_dec_request_new_pad (GstElement * element,
|
gst_dtls_dec_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * tmpl, const gchar * name, const GstCaps * caps)
|
GstPadTemplate * tmpl, const gchar * name, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (element);
|
GstDtlsDec *self = GST_DTLS_DEC (element);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (element, "requesting pad");
|
GST_DEBUG_OBJECT (element, "requesting pad");
|
||||||
|
|
||||||
|
@ -367,9 +363,9 @@ gst_er_dtls_dec_request_new_pad (GstElement * element,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_dec_release_pad (GstElement * element, GstPad * pad)
|
gst_dtls_dec_release_pad (GstElement * element, GstPad * pad)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (element);
|
GstDtlsDec *self = GST_DTLS_DEC (element);
|
||||||
|
|
||||||
g_mutex_lock (&self->src_mutex);
|
g_mutex_lock (&self->src_mutex);
|
||||||
|
|
||||||
|
@ -385,23 +381,23 @@ gst_er_dtls_dec_release_pad (GstElement * element, GstPad * pad)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key_received (ErDtlsConnection * connection, gpointer key, guint cipher,
|
on_key_received (GstDtlsConnection * connection, gpointer key, guint cipher,
|
||||||
guint auth, GstErDtlsDec * self)
|
guint auth, GstDtlsDec * self)
|
||||||
{
|
{
|
||||||
gpointer key_dup;
|
gpointer key_dup;
|
||||||
gchar *key_str;
|
gchar *key_str;
|
||||||
|
|
||||||
UNUSED (connection);
|
UNUSED (connection);
|
||||||
g_return_if_fail (GST_IS_ER_DTLS_DEC (self));
|
g_return_if_fail (GST_IS_DTLS_DEC (self));
|
||||||
|
|
||||||
self->srtp_cipher = cipher;
|
self->srtp_cipher = cipher;
|
||||||
self->srtp_auth = auth;
|
self->srtp_auth = auth;
|
||||||
|
|
||||||
key_dup = g_memdup (key, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
key_dup = g_memdup (key, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
self->decoder_key =
|
self->decodgst_key =
|
||||||
gst_buffer_new_wrapped (key_dup, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
gst_buffer_new_wrapped (key_dup, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
|
|
||||||
key_str = g_base64_encode (key, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
key_str = g_base64_encode (key, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
GST_INFO_OBJECT (self, "received key: %s", key_str);
|
GST_INFO_OBJECT (self, "received key: %s", key_str);
|
||||||
g_free (key_str);
|
g_free (key_str);
|
||||||
|
|
||||||
|
@ -409,9 +405,9 @@ on_key_received (ErDtlsConnection * connection, gpointer key, guint cipher,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
signal_peer_certificate_received (GWeakRef * ref)
|
signal_pegst_certificate_received (GWeakRef * ref)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self;
|
GstDtlsDec *self;
|
||||||
|
|
||||||
self = g_weak_ref_get (ref);
|
self = g_weak_ref_get (ref);
|
||||||
g_weak_ref_clear (ref);
|
g_weak_ref_clear (ref);
|
||||||
|
@ -428,22 +424,22 @@ signal_peer_certificate_received (GWeakRef * ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
on_peer_certificate_received (ErDtlsConnection * connection, gchar * pem,
|
on_pegst_certificate_received (GstDtlsConnection * connection, gchar * pem,
|
||||||
GstErDtlsDec * self)
|
GstDtlsDec * self)
|
||||||
{
|
{
|
||||||
GWeakRef *ref;
|
GWeakRef *ref;
|
||||||
|
|
||||||
UNUSED (connection);
|
UNUSED (connection);
|
||||||
g_return_val_if_fail (GST_IS_ER_DTLS_DEC (self), TRUE);
|
g_return_val_if_fail (GST_IS_DTLS_DEC (self), TRUE);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Received peer certificate PEM: \n%s", pem);
|
GST_DEBUG_OBJECT (self, "Received peer certificate PEM: \n%s", pem);
|
||||||
|
|
||||||
self->peer_pem = g_strdup (pem);
|
self->pegst_pem = g_strdup (pem);
|
||||||
|
|
||||||
ref = g_new (GWeakRef, 1);
|
ref = g_new (GWeakRef, 1);
|
||||||
g_weak_ref_init (ref, self);
|
g_weak_ref_init (ref, self);
|
||||||
|
|
||||||
g_idle_add ((GSourceFunc) signal_peer_certificate_received, ref);
|
g_idle_add ((GSourceFunc) signal_pegst_certificate_received, ref);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -451,7 +447,7 @@ on_peer_certificate_received (ErDtlsConnection * connection, gchar * pem,
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstErDtlsDec *self = GST_ER_DTLS_DEC (parent);
|
GstDtlsDec *self = GST_DTLS_DEC (parent);
|
||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
GstMapInfo map_info = GST_MAP_INFO_INIT;
|
GstMapInfo map_info = GST_MAP_INFO_INIT;
|
||||||
gint size;
|
gint size;
|
||||||
|
@ -472,7 +468,7 @@ sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
size =
|
size =
|
||||||
er_dtls_connection_process (self->connection, map_info.data,
|
gst_dtls_connection_process (self->connection, map_info.data,
|
||||||
map_info.size);
|
map_info.size);
|
||||||
gst_buffer_unmap (buffer, &map_info);
|
gst_buffer_unmap (buffer, &map_info);
|
||||||
|
|
||||||
|
@ -501,19 +497,19 @@ sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
static GHashTable *agent_table = NULL;
|
static GHashTable *agent_table = NULL;
|
||||||
G_LOCK_DEFINE_STATIC (agent_table);
|
G_LOCK_DEFINE_STATIC (agent_table);
|
||||||
|
|
||||||
static ErDtlsAgent *generated_cert_agent = NULL;
|
static GstDtlsAgent *generated_cert_agent = NULL;
|
||||||
|
|
||||||
static ErDtlsAgent *
|
static GstDtlsAgent *
|
||||||
get_agent_by_pem (const gchar * pem)
|
get_agent_by_pem (const gchar * pem)
|
||||||
{
|
{
|
||||||
ErDtlsAgent *agent;
|
GstDtlsAgent *agent;
|
||||||
|
|
||||||
if (!pem) {
|
if (!pem) {
|
||||||
if (g_once_init_enter (&generated_cert_agent)) {
|
if (g_once_init_enter (&generated_cert_agent)) {
|
||||||
ErDtlsAgent *new_agent;
|
GstDtlsAgent *new_agent;
|
||||||
|
|
||||||
new_agent = g_object_new (ER_TYPE_DTLS_AGENT, "certificate",
|
new_agent = g_object_new (GST_TYPE_DTLS_AGENT, "certificate",
|
||||||
g_object_new (ER_TYPE_DTLS_CERTIFICATE, NULL), NULL);
|
g_object_new (GST_TYPE_DTLS_CERTIFICATE, NULL), NULL);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (generated_cert_agent,
|
GST_DEBUG_OBJECT (generated_cert_agent,
|
||||||
"no agent with generated cert found, creating new");
|
"no agent with generated cert found, creating new");
|
||||||
|
@ -533,11 +529,11 @@ get_agent_by_pem (const gchar * pem)
|
||||||
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
agent = ER_DTLS_AGENT (g_hash_table_lookup (agent_table, pem));
|
agent = GST_DTLS_AGENT (g_hash_table_lookup (agent_table, pem));
|
||||||
|
|
||||||
if (!agent) {
|
if (!agent) {
|
||||||
agent = g_object_new (ER_TYPE_DTLS_AGENT,
|
agent = g_object_new (GST_TYPE_DTLS_AGENT,
|
||||||
"certificate", g_object_new (ER_TYPE_DTLS_CERTIFICATE, "pem", pem,
|
"certificate", g_object_new (GST_TYPE_DTLS_CERTIFICATE, "pem", pem,
|
||||||
NULL), NULL);
|
NULL), NULL);
|
||||||
|
|
||||||
g_object_weak_ref (G_OBJECT (agent), (GWeakNotify) agent_weak_ref_notify,
|
g_object_weak_ref (G_OBJECT (agent), (GWeakNotify) agent_weak_ref_notify,
|
||||||
|
@ -559,7 +555,7 @@ get_agent_by_pem (const gchar * pem)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
agent_weak_ref_notify (gchar * pem, ErDtlsAgent * agent)
|
agent_weak_ref_notify (gchar * pem, GstDtlsAgent * agent)
|
||||||
{
|
{
|
||||||
UNUSED (agent);
|
UNUSED (agent);
|
||||||
|
|
||||||
|
@ -574,10 +570,10 @@ agent_weak_ref_notify (gchar * pem, ErDtlsAgent * agent)
|
||||||
static GHashTable *connection_table = NULL;
|
static GHashTable *connection_table = NULL;
|
||||||
G_LOCK_DEFINE_STATIC (connection_table);
|
G_LOCK_DEFINE_STATIC (connection_table);
|
||||||
|
|
||||||
ErDtlsConnection *
|
GstDtlsConnection *
|
||||||
gst_er_dtls_dec_fetch_connection (gchar * id)
|
gst_dtls_dec_fetch_connection (gchar * id)
|
||||||
{
|
{
|
||||||
ErDtlsConnection *connection;
|
GstDtlsConnection *connection;
|
||||||
g_return_val_if_fail (id, NULL);
|
g_return_val_if_fail (id, NULL);
|
||||||
|
|
||||||
GST_DEBUG ("fetching '%s' from connection table, size is %d",
|
GST_DEBUG ("fetching '%s' from connection table, size is %d",
|
||||||
|
@ -600,10 +596,10 @@ gst_er_dtls_dec_fetch_connection (gchar * id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_connection (GstErDtlsDec * self, gchar * id)
|
create_connection (GstDtlsDec * self, gchar * id)
|
||||||
{
|
{
|
||||||
g_return_if_fail (GST_IS_ER_DTLS_DEC (self));
|
g_return_if_fail (GST_IS_DTLS_DEC (self));
|
||||||
g_return_if_fail (ER_IS_DTLS_AGENT (self->agent));
|
g_return_if_fail (GST_IS_DTLS_AGENT (self->agent));
|
||||||
|
|
||||||
if (self->connection) {
|
if (self->connection) {
|
||||||
g_object_unref (self->connection);
|
g_object_unref (self->connection);
|
||||||
|
@ -624,7 +620,7 @@ create_connection (GstErDtlsDec * self, gchar * id)
|
||||||
}
|
}
|
||||||
|
|
||||||
self->connection =
|
self->connection =
|
||||||
g_object_new (ER_TYPE_DTLS_CONNECTION, "agent", self->agent, NULL);
|
g_object_new (GST_TYPE_DTLS_CONNECTION, "agent", self->agent, NULL);
|
||||||
|
|
||||||
g_object_weak_ref (G_OBJECT (self->connection),
|
g_object_weak_ref (G_OBJECT (self->connection),
|
||||||
(GWeakNotify) connection_weak_ref_notify, g_strdup (id));
|
(GWeakNotify) connection_weak_ref_notify, g_strdup (id));
|
||||||
|
@ -635,7 +631,7 @@ create_connection (GstErDtlsDec * self, gchar * id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
connection_weak_ref_notify (gchar * id, ErDtlsConnection * connection)
|
connection_weak_ref_notify (gchar * id, GstDtlsConnection * connection)
|
||||||
{
|
{
|
||||||
UNUSED (connection);
|
UNUSED (connection);
|
||||||
|
|
||||||
|
|
|
@ -33,46 +33,46 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_DEC \
|
#define GST_TYPE_DTLS_DEC \
|
||||||
(gst_er_dtls_dec_get_type())
|
(gst_dtls_dec_get_type())
|
||||||
#define GST_ER_DTLS_DEC(obj) \
|
#define GST_DTLS_DEC(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_DEC, GstErDtlsDec))
|
(G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_DEC, GstDtlsDec))
|
||||||
#define GST_ER_DTLS_DEC_CLASS(klass) \
|
#define GST_DTLS_DEC_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_DEC, GstErDtlsDecClass))
|
(G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_DEC, GstDtlsDecClass))
|
||||||
#define GST_IS_ER_DTLS_DEC(obj) \
|
#define GST_IS_DTLS_DEC(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_DEC))
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_DEC))
|
||||||
#define GST_IS_ER_DTLS_DEC_CLASS(klass) \
|
#define GST_IS_DTLS_DEC_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_DEC))
|
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_DEC))
|
||||||
|
|
||||||
typedef struct _GstErDtlsDec GstErDtlsDec;
|
typedef struct _GstDtlsDec GstDtlsDec;
|
||||||
typedef struct _GstErDtlsDecClass GstErDtlsDecClass;
|
typedef struct _GstDtlsDecClass GstDtlsDecClass;
|
||||||
|
|
||||||
struct _GstErDtlsDec {
|
struct _GstDtlsDec {
|
||||||
GstElement element;
|
GstElement element;
|
||||||
|
|
||||||
GstPad *src;
|
GstPad *src;
|
||||||
GMutex src_mutex;
|
GMutex src_mutex;
|
||||||
|
|
||||||
ErDtlsAgent *agent;
|
GstDtlsAgent *agent;
|
||||||
ErDtlsConnection *connection;
|
GstDtlsConnection *connection;
|
||||||
GMutex connection_mutex;
|
GMutex connection_mutex;
|
||||||
gchar *connection_id;
|
gchar *connection_id;
|
||||||
gchar *peer_pem;
|
gchar *pegst_pem;
|
||||||
|
|
||||||
GstBuffer *decoder_key;
|
GstBuffer *decodgst_key;
|
||||||
guint srtp_cipher;
|
guint srtp_cipher;
|
||||||
guint srtp_auth;
|
guint srtp_auth;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsDecClass {
|
struct _GstDtlsDecClass {
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_dec_get_type(void);
|
GType gst_dtls_dec_get_type(void);
|
||||||
|
|
||||||
gboolean gst_er_dtls_dec_plugin_init(GstPlugin *);
|
gboolean gst_dtls_dec_plugin_init(GstPlugin *);
|
||||||
|
|
||||||
ErDtlsConnection *gst_er_dtls_dec_fetch_connection(gchar *id);
|
GstDtlsConnection *gst_dtls_dec_fetch_connection(gchar *id);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -42,13 +42,12 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_STATIC_CAPS ("application/x-dtls")
|
GST_STATIC_CAPS ("application/x-dtls")
|
||||||
);
|
);
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_enc_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_enc_debug);
|
||||||
#define GST_CAT_DEFAULT er_dtls_enc_debug
|
#define GST_CAT_DEFAULT gst_dtls_enc_debug
|
||||||
|
|
||||||
#define gst_er_dtls_enc_parent_class parent_class
|
#define gst_dtls_enc_parent_class parent_class
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstErDtlsEnc, gst_er_dtls_enc, GST_TYPE_ELEMENT,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsEnc, gst_dtls_enc, GST_TYPE_ELEMENT,
|
||||||
GST_DEBUG_CATEGORY_INIT (er_dtls_enc_debug, "erdtlsenc", 0,
|
GST_DEBUG_CATEGORY_INIT (gst_dtls_enc_debug, "dtlsenc", 0, "DTLS Encoder"));
|
||||||
"Ericsson DTLS Encoder"));
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -81,15 +80,15 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
|
|
||||||
#define INITIAL_QUEUE_SIZE 64
|
#define INITIAL_QUEUE_SIZE 64
|
||||||
|
|
||||||
static void gst_er_dtls_enc_finalize (GObject *);
|
static void gst_dtls_enc_finalize (GObject *);
|
||||||
static void gst_er_dtls_enc_set_property (GObject *, guint prop_id,
|
static void gst_dtls_enc_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void gst_er_dtls_enc_get_property (GObject *, guint prop_id, GValue *,
|
static void gst_dtls_enc_get_property (GObject *, guint prop_id, GValue *,
|
||||||
GParamSpec *);
|
GParamSpec *);
|
||||||
|
|
||||||
static GstStateChangeReturn gst_er_dtls_enc_change_state (GstElement *,
|
static GstStateChangeReturn gst_dtls_enc_change_state (GstElement *,
|
||||||
GstStateChange);
|
GstStateChange);
|
||||||
static GstPad *gst_er_dtls_enc_request_new_pad (GstElement *, GstPadTemplate *,
|
static GstPad *gst_dtls_enc_request_new_pad (GstElement *, GstPadTemplate *,
|
||||||
const gchar * name, const GstCaps *);
|
const gchar * name, const GstCaps *);
|
||||||
|
|
||||||
static gboolean src_activate_mode (GstPad *, GstObject *, GstPadMode,
|
static gboolean src_activate_mode (GstPad *, GstObject *, GstPadMode,
|
||||||
|
@ -98,13 +97,13 @@ static void src_task_loop (GstPad *);
|
||||||
|
|
||||||
static GstFlowReturn sink_chain (GstPad *, GstObject *, GstBuffer *);
|
static GstFlowReturn sink_chain (GstPad *, GstObject *, GstBuffer *);
|
||||||
|
|
||||||
static void on_key_received (ErDtlsConnection *, gpointer key, guint cipher,
|
static void on_key_received (GstDtlsConnection *, gpointer key, guint cipher,
|
||||||
guint auth, GstErDtlsEnc *);
|
guint auth, GstDtlsEnc *);
|
||||||
static void on_send_data (ErDtlsConnection *, gconstpointer data, gint length,
|
static void on_send_data (GstDtlsConnection *, gconstpointer data, gint length,
|
||||||
GstErDtlsEnc *);
|
GstDtlsEnc *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_enc_class_init (GstErDtlsEncClass * klass)
|
gst_dtls_enc_class_init (GstDtlsEncClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
|
@ -112,16 +111,13 @@ gst_er_dtls_enc_class_init (GstErDtlsEncClass * klass)
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
element_class = (GstElementClass *) klass;
|
element_class = (GstElementClass *) klass;
|
||||||
|
|
||||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_er_dtls_enc_finalize);
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_dtls_enc_finalize);
|
||||||
gobject_class->set_property =
|
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_dtls_enc_set_property);
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_enc_set_property);
|
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_dtls_enc_get_property);
|
||||||
gobject_class->get_property =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_enc_get_property);
|
|
||||||
|
|
||||||
element_class->change_state =
|
element_class->change_state = GST_DEBUG_FUNCPTR (gst_dtls_enc_change_state);
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_enc_change_state);
|
|
||||||
element_class->request_new_pad =
|
element_class->request_new_pad =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_enc_request_new_pad);
|
GST_DEBUG_FUNCPTR (gst_dtls_enc_request_new_pad);
|
||||||
|
|
||||||
signals[SIGNAL_ON_KEY_RECEIVED] =
|
signals[SIGNAL_ON_KEY_RECEIVED] =
|
||||||
g_signal_new ("on-key-received", G_TYPE_FROM_CLASS (klass),
|
g_signal_new ("on-key-received", G_TYPE_FROM_CLASS (klass),
|
||||||
|
@ -152,16 +148,16 @@ gst_er_dtls_enc_class_init (GstErDtlsEncClass * klass)
|
||||||
g_param_spec_uint ("srtp-cipher",
|
g_param_spec_uint ("srtp-cipher",
|
||||||
"SRTP cipher",
|
"SRTP cipher",
|
||||||
"The SRTP cipher selected in the DTLS handshake. "
|
"The SRTP cipher selected in the DTLS handshake. "
|
||||||
"The value will be set to an ErDtlsSrtpCipher.",
|
"The value will be set to an GstDtlsSrtpCipher.",
|
||||||
0, ER_DTLS_SRTP_CIPHER_AES_128_ICM, DEFAULT_SRTP_CIPHER,
|
0, GST_DTLS_SRTP_CIPHER_AES_128_ICM, DEFAULT_SRTP_CIPHER,
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
properties[PROP_SRTP_AUTH] =
|
properties[PROP_SRTP_AUTH] =
|
||||||
g_param_spec_uint ("srtp-auth",
|
g_param_spec_uint ("srtp-auth",
|
||||||
"SRTP authentication",
|
"SRTP authentication",
|
||||||
"The SRTP authentication selected in the DTLS handshake. "
|
"The SRTP authentication selected in the DTLS handshake. "
|
||||||
"The value will be set to an ErDtlsSrtpAuth.",
|
"The value will be set to an GstDtlsSrtpAuth.",
|
||||||
0, ER_DTLS_SRTP_AUTH_HMAC_SHA1_80, DEFAULT_SRTP_AUTH,
|
0, GST_DTLS_SRTP_AUTH_HMAC_SHA1_80, DEFAULT_SRTP_AUTH,
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
||||||
|
@ -179,14 +175,14 @@ gst_er_dtls_enc_class_init (GstErDtlsEncClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_enc_init (GstErDtlsEnc * self)
|
gst_dtls_enc_init (GstDtlsEnc * self)
|
||||||
{
|
{
|
||||||
self->connection_id = NULL;
|
self->connection_id = NULL;
|
||||||
self->connection = NULL;
|
self->connection = NULL;
|
||||||
|
|
||||||
self->is_client = DEFAULT_IS_CLIENT;
|
self->is_client = DEFAULT_IS_CLIENT;
|
||||||
|
|
||||||
self->encoder_key = NULL;
|
self->encodgst_key = NULL;
|
||||||
self->srtp_cipher = DEFAULT_SRTP_CIPHER;
|
self->srtp_cipher = DEFAULT_SRTP_CIPHER;
|
||||||
self->srtp_auth = DEFAULT_SRTP_AUTH;
|
self->srtp_auth = DEFAULT_SRTP_AUTH;
|
||||||
|
|
||||||
|
@ -205,13 +201,13 @@ gst_er_dtls_enc_init (GstErDtlsEnc * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_enc_finalize (GObject * object)
|
gst_dtls_enc_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (object);
|
GstDtlsEnc *self = GST_DTLS_ENC (object);
|
||||||
|
|
||||||
if (self->encoder_key) {
|
if (self->encodgst_key) {
|
||||||
gst_buffer_unref (self->encoder_key);
|
gst_buffer_unref (self->encodgst_key);
|
||||||
self->encoder_key = NULL;
|
self->encodgst_key = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mutex_lock (&self->queue_lock);
|
g_mutex_lock (&self->queue_lock);
|
||||||
|
@ -231,10 +227,10 @@ gst_er_dtls_enc_finalize (GObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_enc_set_property (GObject * object, guint prop_id,
|
gst_dtls_enc_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (object);
|
GstDtlsEnc *self = GST_DTLS_ENC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
@ -249,10 +245,10 @@ gst_er_dtls_enc_set_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
gst_dtls_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
GParamSpec * pspec)
|
GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (object);
|
GstDtlsEnc *self = GST_DTLS_ENC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
@ -262,7 +258,7 @@ gst_er_dtls_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
g_value_set_boolean (value, self->is_client);
|
g_value_set_boolean (value, self->is_client);
|
||||||
break;
|
break;
|
||||||
case PROP_ENCODER_KEY:
|
case PROP_ENCODER_KEY:
|
||||||
g_value_set_boxed (value, self->encoder_key);
|
g_value_set_boxed (value, self->encodgst_key);
|
||||||
break;
|
break;
|
||||||
case PROP_SRTP_CIPHER:
|
case PROP_SRTP_CIPHER:
|
||||||
g_value_set_uint (value, self->srtp_cipher);
|
g_value_set_uint (value, self->srtp_cipher);
|
||||||
|
@ -276,16 +272,15 @@ gst_er_dtls_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_er_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
gst_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (element);
|
GstDtlsEnc *self = GST_DTLS_ENC (element);
|
||||||
GstStateChangeReturn ret;
|
GstStateChangeReturn ret;
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
if (self->connection_id) {
|
if (self->connection_id) {
|
||||||
self->connection =
|
self->connection = gst_dtls_dec_fetch_connection (self->connection_id);
|
||||||
gst_er_dtls_dec_fetch_connection (self->connection_id);
|
|
||||||
|
|
||||||
if (!self->connection) {
|
if (!self->connection) {
|
||||||
GST_WARNING_OBJECT (self,
|
GST_WARNING_OBJECT (self,
|
||||||
|
@ -297,7 +292,7 @@ gst_er_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
g_signal_connect_object (self->connection,
|
g_signal_connect_object (self->connection,
|
||||||
"on-encoder-key", G_CALLBACK (on_key_received), self, 0);
|
"on-encoder-key", G_CALLBACK (on_key_received), self, 0);
|
||||||
|
|
||||||
er_dtls_connection_set_send_callback (self->connection,
|
gst_dtls_connection_set_send_callback (self->connection,
|
||||||
g_cclosure_new (G_CALLBACK (on_send_data), self, NULL));
|
g_cclosure_new (G_CALLBACK (on_send_data), self, NULL));
|
||||||
} else {
|
} else {
|
||||||
GST_WARNING_OBJECT (self,
|
GST_WARNING_OBJECT (self,
|
||||||
|
@ -307,7 +302,7 @@ gst_er_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
GST_DEBUG_OBJECT (self, "starting connection %s", self->connection_id);
|
GST_DEBUG_OBJECT (self, "starting connection %s", self->connection_id);
|
||||||
er_dtls_connection_start (self->connection, self->is_client);
|
gst_dtls_connection_start (self->connection, self->is_client);
|
||||||
|
|
||||||
gst_pad_set_active (self->src, TRUE);
|
gst_pad_set_active (self->src, TRUE);
|
||||||
break;
|
break;
|
||||||
|
@ -315,14 +310,14 @@ gst_er_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
GST_DEBUG_OBJECT (self, "stopping connection %s", self->connection_id);
|
GST_DEBUG_OBJECT (self, "stopping connection %s", self->connection_id);
|
||||||
gst_pad_set_active (self->src, FALSE);
|
gst_pad_set_active (self->src, FALSE);
|
||||||
|
|
||||||
er_dtls_connection_stop (self->connection);
|
gst_dtls_connection_stop (self->connection);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
GST_DEBUG_OBJECT (self, "closing connection %s", self->connection_id);
|
GST_DEBUG_OBJECT (self, "closing connection %s", self->connection_id);
|
||||||
|
|
||||||
if (self->connection) {
|
if (self->connection) {
|
||||||
er_dtls_connection_close (self->connection);
|
gst_dtls_connection_close (self->connection);
|
||||||
er_dtls_connection_set_send_callback (self->connection, NULL);
|
gst_dtls_connection_set_send_callback (self->connection, NULL);
|
||||||
g_object_unref (self->connection);
|
g_object_unref (self->connection);
|
||||||
self->connection = NULL;
|
self->connection = NULL;
|
||||||
}
|
}
|
||||||
|
@ -337,7 +332,7 @@ gst_er_dtls_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPad *
|
static GstPad *
|
||||||
gst_er_dtls_enc_request_new_pad (GstElement * element,
|
gst_dtls_enc_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstPad *sink;
|
GstPad *sink;
|
||||||
|
@ -368,7 +363,7 @@ static gboolean
|
||||||
src_activate_mode (GstPad * pad, GstObject * parent, GstPadMode mode,
|
src_activate_mode (GstPad * pad, GstObject * parent, GstPadMode mode,
|
||||||
gboolean active)
|
gboolean active)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (parent);
|
GstDtlsEnc *self = GST_DTLS_ENC (parent);
|
||||||
gboolean success = TRUE;
|
gboolean success = TRUE;
|
||||||
g_return_val_if_fail (mode == GST_PAD_MODE_PUSH, FALSE);
|
g_return_val_if_fail (mode == GST_PAD_MODE_PUSH, FALSE);
|
||||||
|
|
||||||
|
@ -401,10 +396,10 @@ src_activate_mode (GstPad * pad, GstObject * parent, GstPadMode mode,
|
||||||
static void
|
static void
|
||||||
src_task_loop (GstPad * pad)
|
src_task_loop (GstPad * pad)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (GST_PAD_PARENT (pad));
|
GstDtlsEnc *self = GST_DTLS_ENC (GST_PAD_PARENT (pad));
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
GstPad *peer;
|
GstPad *peer;
|
||||||
gboolean peer_is_active;
|
gboolean pegst_is_active;
|
||||||
|
|
||||||
GST_TRACE_OBJECT (self, "src loop: acquiring lock");
|
GST_TRACE_OBJECT (self, "src loop: acquiring lock");
|
||||||
g_mutex_lock (&self->queue_lock);
|
g_mutex_lock (&self->queue_lock);
|
||||||
|
@ -432,10 +427,10 @@ src_task_loop (GstPad * pad)
|
||||||
GST_TRACE_OBJECT (self, "src loop: queue has element");
|
GST_TRACE_OBJECT (self, "src loop: queue has element");
|
||||||
|
|
||||||
peer = gst_pad_get_peer (pad);
|
peer = gst_pad_get_peer (pad);
|
||||||
peer_is_active = gst_pad_is_active (peer);
|
pegst_is_active = gst_pad_is_active (peer);
|
||||||
gst_object_unref (peer);
|
gst_object_unref (peer);
|
||||||
|
|
||||||
if (peer_is_active) {
|
if (pegst_is_active) {
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
gboolean start_connection_timeout = FALSE;
|
gboolean start_connection_timeout = FALSE;
|
||||||
|
|
||||||
|
@ -444,7 +439,7 @@ src_task_loop (GstPad * pad)
|
||||||
gchar s_id[32];
|
gchar s_id[32];
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
g_snprintf (s_id, sizeof (s_id), "erdtlsenc-%08x", g_random_int ());
|
g_snprintf (s_id, sizeof (s_id), "dtlsenc-%08x", g_random_int ());
|
||||||
gst_pad_push_event (self->src, gst_event_new_stream_start (s_id));
|
gst_pad_push_event (self->src, gst_event_new_stream_start (s_id));
|
||||||
caps = gst_caps_new_empty_simple ("application/x-dtls");
|
caps = gst_caps_new_empty_simple ("application/x-dtls");
|
||||||
gst_pad_push_event (self->src, gst_event_new_caps (caps));
|
gst_pad_push_event (self->src, gst_event_new_caps (caps));
|
||||||
|
@ -462,7 +457,7 @@ src_task_loop (GstPad * pad)
|
||||||
|
|
||||||
ret = gst_pad_push (self->src, buffer);
|
ret = gst_pad_push (self->src, buffer);
|
||||||
if (start_connection_timeout)
|
if (start_connection_timeout)
|
||||||
er_dtls_connection_start_timeout (self->connection);
|
gst_dtls_connection_start_timeout (self->connection);
|
||||||
|
|
||||||
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
|
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
|
||||||
GST_WARNING_OBJECT (self, "failed to push buffer on src pad: %s",
|
GST_WARNING_OBJECT (self, "failed to push buffer on src pad: %s",
|
||||||
|
@ -478,7 +473,7 @@ src_task_loop (GstPad * pad)
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstErDtlsEnc *self = GST_ER_DTLS_ENC (parent);
|
GstDtlsEnc *self = GST_DTLS_ENC (parent);
|
||||||
GstMapInfo map_info;
|
GstMapInfo map_info;
|
||||||
gint ret;
|
gint ret;
|
||||||
|
|
||||||
|
@ -486,7 +481,7 @@ sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
|
|
||||||
if (map_info.size) {
|
if (map_info.size) {
|
||||||
ret =
|
ret =
|
||||||
er_dtls_connection_send (self->connection, map_info.data,
|
gst_dtls_connection_send (self->connection, map_info.data,
|
||||||
map_info.size);
|
map_info.size);
|
||||||
if (ret != map_info.size) {
|
if (ret != map_info.size) {
|
||||||
GST_WARNING_OBJECT (self,
|
GST_WARNING_OBJECT (self,
|
||||||
|
@ -503,23 +498,23 @@ sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key_received (ErDtlsConnection * connection, gpointer key, guint cipher,
|
on_key_received (GstDtlsConnection * connection, gpointer key, guint cipher,
|
||||||
guint auth, GstErDtlsEnc * self)
|
guint auth, GstDtlsEnc * self)
|
||||||
{
|
{
|
||||||
gpointer key_dup;
|
gpointer key_dup;
|
||||||
gchar *key_str;
|
gchar *key_str;
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_ER_DTLS_ENC (self));
|
g_return_if_fail (GST_IS_DTLS_ENC (self));
|
||||||
g_return_if_fail (ER_IS_DTLS_CONNECTION (connection));
|
g_return_if_fail (GST_IS_DTLS_CONNECTION (connection));
|
||||||
|
|
||||||
self->srtp_cipher = cipher;
|
self->srtp_cipher = cipher;
|
||||||
self->srtp_auth = auth;
|
self->srtp_auth = auth;
|
||||||
|
|
||||||
key_dup = g_memdup (key, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
key_dup = g_memdup (key, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
self->encoder_key =
|
self->encodgst_key =
|
||||||
gst_buffer_new_wrapped (key_dup, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
gst_buffer_new_wrapped (key_dup, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
|
|
||||||
key_str = g_base64_encode (key, ER_DTLS_SRTP_MASTER_KEY_LENGTH);
|
key_str = g_base64_encode (key, GST_DTLS_SRTP_MASTER_KEY_LENGTH);
|
||||||
GST_INFO_OBJECT (self, "received key: %s", key_str);
|
GST_INFO_OBJECT (self, "received key: %s", key_str);
|
||||||
g_free (key_str);
|
g_free (key_str);
|
||||||
|
|
||||||
|
@ -527,8 +522,8 @@ on_key_received (ErDtlsConnection * connection, gpointer key, guint cipher,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_send_data (ErDtlsConnection * connection, gconstpointer data, gint length,
|
on_send_data (GstDtlsConnection * connection, gconstpointer data, gint length,
|
||||||
GstErDtlsEnc * self)
|
GstDtlsEnc * self)
|
||||||
{
|
{
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
|
|
||||||
|
|
|
@ -33,16 +33,16 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_ENC (gst_er_dtls_enc_get_type())
|
#define GST_TYPE_DTLS_ENC (gst_dtls_enc_get_type())
|
||||||
#define GST_ER_DTLS_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_ENC, GstErDtlsEnc))
|
#define GST_DTLS_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_ENC, GstDtlsEnc))
|
||||||
#define GST_ER_DTLS_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_ENC, GstErDtlsEncClass))
|
#define GST_DTLS_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_ENC, GstDtlsEncClass))
|
||||||
#define GST_IS_ER_DTLS_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_ENC))
|
#define GST_IS_DTLS_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_ENC))
|
||||||
#define GST_IS_ER_DTLS_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_ENC))
|
#define GST_IS_DTLS_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_ENC))
|
||||||
|
|
||||||
typedef struct _GstErDtlsEnc GstErDtlsEnc;
|
typedef struct _GstDtlsEnc GstDtlsEnc;
|
||||||
typedef struct _GstErDtlsEncClass GstErDtlsEncClass;
|
typedef struct _GstDtlsEncClass GstDtlsEncClass;
|
||||||
|
|
||||||
struct _GstErDtlsEnc {
|
struct _GstDtlsEnc {
|
||||||
GstElement element;
|
GstElement element;
|
||||||
|
|
||||||
GstPad *src;
|
GstPad *src;
|
||||||
|
@ -51,25 +51,25 @@ struct _GstErDtlsEnc {
|
||||||
GMutex queue_lock;
|
GMutex queue_lock;
|
||||||
GCond queue_cond_add;
|
GCond queue_cond_add;
|
||||||
|
|
||||||
ErDtlsConnection *connection;
|
GstDtlsConnection *connection;
|
||||||
gchar *connection_id;
|
gchar *connection_id;
|
||||||
|
|
||||||
gboolean is_client;
|
gboolean is_client;
|
||||||
|
|
||||||
GstBuffer *encoder_key;
|
GstBuffer *encodgst_key;
|
||||||
guint srtp_cipher;
|
guint srtp_cipher;
|
||||||
guint srtp_auth;
|
guint srtp_auth;
|
||||||
|
|
||||||
gboolean send_initial_events;
|
gboolean send_initial_events;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsEncClass {
|
struct _GstDtlsEncClass {
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_enc_get_type(void);
|
GType gst_dtls_enc_get_type(void);
|
||||||
|
|
||||||
gboolean gst_er_dtls_enc_plugin_init(GstPlugin *);
|
gboolean gst_dtls_enc_plugin_init(GstPlugin *);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,8 @@
|
||||||
|
|
||||||
#include "gstdtlssrtpbin.h"
|
#include "gstdtlssrtpbin.h"
|
||||||
|
|
||||||
#define gst_er_dtls_srtp_bin_parent_class parent_class
|
#define gst_dtls_srtp_bin_parent_class parent_class
|
||||||
G_DEFINE_ABSTRACT_TYPE (GstErDtlsSrtpBin, gst_er_dtls_srtp_bin, GST_TYPE_BIN);
|
G_DEFINE_ABSTRACT_TYPE (GstDtlsSrtpBin, gst_dtls_srtp_bin, GST_TYPE_BIN);
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -54,24 +54,24 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
#define DEFAULT_SRTCP_AUTH NULL
|
#define DEFAULT_SRTCP_AUTH NULL
|
||||||
#define DEFAULT_SRTCP_CIPHER NULL
|
#define DEFAULT_SRTCP_CIPHER NULL
|
||||||
|
|
||||||
static void gst_er_dtls_srtp_bin_finalize (GObject *);
|
static void gst_dtls_srtp_bin_finalize (GObject *);
|
||||||
static void gst_er_dtls_srtp_bin_set_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_bin_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void gst_er_dtls_srtp_bin_get_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_bin_get_property (GObject *, guint prop_id,
|
||||||
GValue *, GParamSpec *);
|
GValue *, GParamSpec *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_bin_class_init (GstErDtlsSrtpBinClass * klass)
|
gst_dtls_srtp_bin_class_init (GstDtlsSrtpBinClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
|
|
||||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_bin_finalize);
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_finalize);
|
||||||
gobject_class->set_property =
|
gobject_class->set_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_bin_set_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_set_property);
|
||||||
gobject_class->get_property =
|
gobject_class->get_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_bin_get_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_get_property);
|
||||||
|
|
||||||
klass->remove_dtls_element = NULL;
|
klass->remove_dtls_element = NULL;
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ gst_er_dtls_srtp_bin_class_init (GstErDtlsSrtpBinClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_bin_init (GstErDtlsSrtpBin * self)
|
gst_dtls_srtp_bin_init (GstDtlsSrtpBin * self)
|
||||||
{
|
{
|
||||||
self->key = NULL;
|
self->key = NULL;
|
||||||
self->key_is_set = FALSE;
|
self->key_is_set = FALSE;
|
||||||
|
@ -135,9 +135,9 @@ gst_er_dtls_srtp_bin_init (GstErDtlsSrtpBin * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_bin_finalize (GObject * object)
|
gst_dtls_srtp_bin_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpBin *self = GST_ER_DTLS_SRTP_BIN (object);
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
||||||
|
|
||||||
if (self->key) {
|
if (self->key) {
|
||||||
gst_buffer_unref (self->key);
|
gst_buffer_unref (self->key);
|
||||||
|
@ -156,11 +156,11 @@ gst_er_dtls_srtp_bin_finalize (GObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_bin_set_property (GObject * object,
|
gst_dtls_srtp_bin_set_property (GObject * object,
|
||||||
guint prop_id, const GValue * value, GParamSpec * pspec)
|
guint prop_id, const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpBin *self = GST_ER_DTLS_SRTP_BIN (object);
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
||||||
GstErDtlsSrtpBinClass *klass = GST_ER_DTLS_SRTP_BIN_GET_CLASS (self);
|
GstDtlsSrtpBinClass *klass = GST_DTLS_SRTP_BIN_GET_CLASS (self);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
@ -205,10 +205,10 @@ gst_er_dtls_srtp_bin_set_property (GObject * object,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_bin_get_property (GObject * object,
|
gst_dtls_srtp_bin_get_property (GObject * object,
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec)
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpBin *self = GST_ER_DTLS_SRTP_BIN (object);
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_ID:
|
case PROP_CONNECTION_ID:
|
||||||
|
|
|
@ -30,17 +30,17 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_SRTP_BIN (gst_er_dtls_srtp_bin_get_type())
|
#define GST_TYPE_DTLS_SRTP_BIN (gst_dtls_srtp_bin_get_type())
|
||||||
#define GST_ER_DTLS_SRTP_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_SRTP_BIN, GstErDtlsSrtpBin))
|
#define GST_DTLS_SRTP_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_SRTP_BIN, GstDtlsSrtpBin))
|
||||||
#define GST_ER_DTLS_SRTP_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_SRTP_BIN, GstErDtlsSrtpBinClass))
|
#define GST_DTLS_SRTP_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_SRTP_BIN, GstDtlsSrtpBinClass))
|
||||||
#define GST_ER_DTLS_SRTP_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_ER_DTLS_SRTP_BIN, GstErDtlsSrtpBinClass))
|
#define GST_DTLS_SRTP_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DTLS_SRTP_BIN, GstDtlsSrtpBinClass))
|
||||||
#define GST_IS_ER_DTLS_SRTP_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_SRTP_BIN))
|
#define GST_IS_DTLS_SRTP_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_SRTP_BIN))
|
||||||
#define GST_IS_ER_DTLS_SRTP_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_SRTP_BIN))
|
#define GST_IS_DTLS_SRTP_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_SRTP_BIN))
|
||||||
|
|
||||||
typedef struct _GstErDtlsSrtpBin GstErDtlsSrtpBin;
|
typedef struct _GstDtlsSrtpBin GstDtlsSrtpBin;
|
||||||
typedef struct _GstErDtlsSrtpBinClass GstErDtlsSrtpBinClass;
|
typedef struct _GstDtlsSrtpBinClass GstDtlsSrtpBinClass;
|
||||||
|
|
||||||
struct _GstErDtlsSrtpBin {
|
struct _GstDtlsSrtpBin {
|
||||||
GstBin bin;
|
GstBin bin;
|
||||||
|
|
||||||
GstElement *dtls_element;
|
GstElement *dtls_element;
|
||||||
|
@ -53,13 +53,13 @@ struct _GstErDtlsSrtpBin {
|
||||||
gchar *srtcp_auth;
|
gchar *srtcp_auth;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsSrtpBinClass {
|
struct _GstDtlsSrtpBinClass {
|
||||||
GstBinClass parent_class;
|
GstBinClass parent_class;
|
||||||
|
|
||||||
void (*remove_dtls_element)(GstErDtlsSrtpBin *);
|
void (*remove_dtls_element)(GstDtlsSrtpBin *);
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_srtp_bin_get_type(void);
|
GType gst_dtls_srtp_bin_get_type(void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -49,13 +49,13 @@ GST_STATIC_PAD_TEMPLATE ("data_src",
|
||||||
GST_PAD_REQUEST,
|
GST_PAD_REQUEST,
|
||||||
GST_STATIC_CAPS_ANY);
|
GST_STATIC_CAPS_ANY);
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_srtp_dec_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_srtp_dec_debug);
|
||||||
#define GST_CAT_DEFAULT er_dtls_srtp_dec_debug
|
#define GST_CAT_DEFAULT gst_dtls_srtp_dec_debug
|
||||||
|
|
||||||
#define gst_er_dtls_srtp_dec_parent_class parent_class
|
#define gst_dtls_srtp_dec_parent_class parent_class
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstErDtlsSrtpDec, gst_er_dtls_srtp_dec,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsSrtpDec, gst_dtls_srtp_dec,
|
||||||
GST_TYPE_ER_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (er_dtls_srtp_dec_debug,
|
GST_TYPE_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (gst_dtls_srtp_dec_debug,
|
||||||
"erdtlssrtpdec", 0, "Ericsson DTLS Decoder"));
|
"dtlssrtpdec", 0, "DTLS Decoder"));
|
||||||
|
|
||||||
#define UNUSED(param) while (0) { (void)(param); }
|
#define UNUSED(param) while (0) { (void)(param); }
|
||||||
|
|
||||||
|
@ -72,46 +72,46 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
#define DEFAULT_PEM NULL
|
#define DEFAULT_PEM NULL
|
||||||
#define DEFAULT_PEER_PEM NULL
|
#define DEFAULT_PEER_PEM NULL
|
||||||
|
|
||||||
static void gst_er_dtls_srtp_dec_set_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_dec_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void gst_er_dtls_srtp_dec_get_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_dec_get_property (GObject *, guint prop_id,
|
||||||
GValue *, GParamSpec *);
|
GValue *, GParamSpec *);
|
||||||
|
|
||||||
static GstPad *gst_er_dtls_srtp_dec_request_new_pad (GstElement *,
|
static GstPad *gst_dtls_srtp_dec_request_new_pad (GstElement *,
|
||||||
GstPadTemplate *, const gchar * name, const GstCaps *);
|
GstPadTemplate *, const gchar * name, const GstCaps *);
|
||||||
static GstCaps *on_decoder_request_key (GstElement * srtp_decoder, guint ssrc,
|
static GstCaps *on_decodgst_request_key (GstElement * srtp_decoder, guint ssrc,
|
||||||
GstErDtlsSrtpBin *);
|
GstDtlsSrtpBin *);
|
||||||
static void on_peer_pem (GstElement * srtp_decoder, GParamSpec * pspec,
|
static void on_pegst_pem (GstElement * srtp_decoder, GParamSpec * pspec,
|
||||||
GstErDtlsSrtpDec * self);
|
GstDtlsSrtpDec * self);
|
||||||
|
|
||||||
static void gst_er_dtls_srtp_dec_remove_dtls_element (GstErDtlsSrtpBin *);
|
static void gst_dtls_srtp_dec_remove_dtls_element (GstDtlsSrtpBin *);
|
||||||
static GstPadProbeReturn remove_dtls_decoder_probe_callback (GstPad *,
|
static GstPadProbeReturn remove_dtls_decodgst_probe_callback (GstPad *,
|
||||||
GstPadProbeInfo *, GstElement *);
|
GstPadProbeInfo *, GstElement *);
|
||||||
|
|
||||||
static GstPadProbeReturn drop_funnel_rtcp_caps (GstPad *, GstPadProbeInfo *,
|
static GstPadProbeReturn drop_funnel_rtcp_caps (GstPad *, GstPadProbeInfo *,
|
||||||
gpointer);
|
gpointer);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_dec_class_init (GstErDtlsSrtpDecClass * klass)
|
gst_dtls_srtp_dec_class_init (GstDtlsSrtpDecClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
GstErDtlsSrtpBinClass *dtls_srtp_bin_class;
|
GstDtlsSrtpBinClass *dtls_srtp_bin_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
element_class = (GstElementClass *) klass;
|
element_class = (GstElementClass *) klass;
|
||||||
dtls_srtp_bin_class = (GstErDtlsSrtpBinClass *) klass;
|
dtls_srtp_bin_class = (GstDtlsSrtpBinClass *) klass;
|
||||||
|
|
||||||
gobject_class->set_property =
|
gobject_class->set_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_dec_set_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_dec_set_property);
|
||||||
gobject_class->get_property =
|
gobject_class->get_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_dec_get_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_dec_get_property);
|
||||||
|
|
||||||
element_class->request_new_pad =
|
element_class->request_new_pad =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_dec_request_new_pad);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_dec_request_new_pad);
|
||||||
|
|
||||||
dtls_srtp_bin_class->remove_dtls_element =
|
dtls_srtp_bin_class->remove_dtls_element =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_dec_remove_dtls_element);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_dec_remove_dtls_element);
|
||||||
|
|
||||||
properties[PROP_PEM] =
|
properties[PROP_PEM] =
|
||||||
g_param_spec_string ("pem",
|
g_param_spec_string ("pem",
|
||||||
|
@ -142,7 +142,7 @@ gst_er_dtls_srtp_dec_class_init (GstErDtlsSrtpDecClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_dec_init (GstErDtlsSrtpDec * self)
|
gst_dtls_srtp_dec_init (GstDtlsSrtpDec * self)
|
||||||
{
|
{
|
||||||
GstElementClass *klass = GST_ELEMENT_GET_CLASS (GST_ELEMENT (self));
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (GST_ELEMENT (self));
|
||||||
GstPadTemplate *templ;
|
GstPadTemplate *templ;
|
||||||
|
@ -151,7 +151,7 @@ gst_er_dtls_srtp_dec_init (GstErDtlsSrtpDec * self)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
+--------------------+
|
+--------------------+
|
||||||
+--------------+ .-o| erdtlsdec |o-R----------data
|
+--------------+ .-o| dtlsdec |o-R----------data
|
||||||
| dtls|o-' +--------------------+
|
| dtls|o-' +--------------------+
|
||||||
sink---o| dtlsdemux |
|
sink---o| dtlsdemux |
|
||||||
| srt(c)p|o-. +-----------+ +-----------+
|
| srt(c)p|o-. +-----------+ +-----------+
|
||||||
|
@ -168,13 +168,12 @@ gst_er_dtls_srtp_dec_init (GstErDtlsSrtpDec * self)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self->dtls_srtp_demux =
|
self->dtls_srtp_demux =
|
||||||
gst_element_factory_make ("erdtlssrtpdemux", "dtls-srtp-demux");
|
gst_element_factory_make ("dtlssrtpdemux", "dtls-srtp-demux");
|
||||||
if (!self->dtls_srtp_demux) {
|
if (!self->dtls_srtp_demux) {
|
||||||
GST_ERROR_OBJECT (self, "failed to create dtls_srtp_demux");
|
GST_ERROR_OBJECT (self, "failed to create dtls_srtp_demux");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self->bin.dtls_element =
|
self->bin.dtls_element = gst_element_factory_make ("dtlsdec", "dtls-decoder");
|
||||||
gst_element_factory_make ("erdtlsdec", "dtls-decoder");
|
|
||||||
if (!self->bin.dtls_element) {
|
if (!self->bin.dtls_element) {
|
||||||
GST_ERROR_OBJECT (self, "failed to create dtls_dec");
|
GST_ERROR_OBJECT (self, "failed to create dtls_dec");
|
||||||
return;
|
return;
|
||||||
|
@ -229,16 +228,16 @@ gst_er_dtls_srtp_dec_init (GstErDtlsSrtpDec * self)
|
||||||
g_return_if_fail (ret);
|
g_return_if_fail (ret);
|
||||||
|
|
||||||
g_signal_connect (self->srtp_dec, "request-key",
|
g_signal_connect (self->srtp_dec, "request-key",
|
||||||
G_CALLBACK (on_decoder_request_key), self);
|
G_CALLBACK (on_decodgst_request_key), self);
|
||||||
g_signal_connect (self->bin.dtls_element, "notify::peer-pem",
|
g_signal_connect (self->bin.dtls_element, "notify::peer-pem",
|
||||||
G_CALLBACK (on_peer_pem), self);
|
G_CALLBACK (on_pegst_pem), self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_dec_set_property (GObject * object,
|
gst_dtls_srtp_dec_set_property (GObject * object,
|
||||||
guint prop_id, const GValue * value, GParamSpec * pspec)
|
guint prop_id, const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpDec *self = GST_ER_DTLS_SRTP_DEC (object);
|
GstDtlsSrtpDec *self = GST_DTLS_SRTP_DEC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_PEM:
|
case PROP_PEM:
|
||||||
|
@ -254,10 +253,10 @@ gst_er_dtls_srtp_dec_set_property (GObject * object,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_dec_get_property (GObject * object,
|
gst_dtls_srtp_dec_get_property (GObject * object,
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec)
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpDec *self = GST_ER_DTLS_SRTP_DEC (object);
|
GstDtlsSrtpDec *self = GST_DTLS_SRTP_DEC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_PEM:
|
case PROP_PEM:
|
||||||
|
@ -281,10 +280,10 @@ gst_er_dtls_srtp_dec_get_property (GObject * object,
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPad *
|
static GstPad *
|
||||||
gst_er_dtls_srtp_dec_request_new_pad (GstElement * element,
|
gst_dtls_srtp_dec_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpDec *self = GST_ER_DTLS_SRTP_DEC (element);
|
GstDtlsSrtpDec *self = GST_DTLS_SRTP_DEC (element);
|
||||||
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
||||||
GstPad *ghost_pad = NULL;
|
GstPad *ghost_pad = NULL;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
@ -321,8 +320,8 @@ gst_er_dtls_srtp_dec_request_new_pad (GstElement * element,
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
on_decoder_request_key (GstElement * srtp_decoder,
|
on_decodgst_request_key (GstElement * srtp_decoder,
|
||||||
guint ssrc, GstErDtlsSrtpBin * bin)
|
guint ssrc, GstDtlsSrtpBin * bin)
|
||||||
{
|
{
|
||||||
GstCaps *key_caps;
|
GstCaps *key_caps;
|
||||||
GstBuffer *key_buffer = NULL;
|
GstBuffer *key_buffer = NULL;
|
||||||
|
@ -364,7 +363,7 @@ on_decoder_request_key (GstElement * srtp_decoder,
|
||||||
g_object_get (bin->dtls_element,
|
g_object_get (bin->dtls_element,
|
||||||
"srtp-cipher", &cipher, "srtp-auth", &auth, NULL);
|
"srtp-cipher", &cipher, "srtp-auth", &auth, NULL);
|
||||||
|
|
||||||
g_return_val_if_fail (cipher == ER_DTLS_SRTP_CIPHER_AES_128_ICM, NULL);
|
g_return_val_if_fail (cipher == GST_DTLS_SRTP_CIPHER_AES_128_ICM, NULL);
|
||||||
|
|
||||||
key_caps = gst_caps_new_simple ("application/x-srtp",
|
key_caps = gst_caps_new_simple ("application/x-srtp",
|
||||||
"srtp-key", GST_TYPE_BUFFER, key_buffer,
|
"srtp-key", GST_TYPE_BUFFER, key_buffer,
|
||||||
|
@ -372,12 +371,12 @@ on_decoder_request_key (GstElement * srtp_decoder,
|
||||||
"srtcp-cipher", G_TYPE_STRING, "aes-128-icm", NULL);
|
"srtcp-cipher", G_TYPE_STRING, "aes-128-icm", NULL);
|
||||||
|
|
||||||
switch (auth) {
|
switch (auth) {
|
||||||
case ER_DTLS_SRTP_AUTH_HMAC_SHA1_32:
|
case GST_DTLS_SRTP_AUTH_HMAC_SHA1_32:
|
||||||
gst_caps_set_simple (key_caps,
|
gst_caps_set_simple (key_caps,
|
||||||
"srtp-auth", G_TYPE_STRING, "hmac-sha1-32",
|
"srtp-auth", G_TYPE_STRING, "hmac-sha1-32",
|
||||||
"srtcp-auth", G_TYPE_STRING, "hmac-sha1-32", NULL);
|
"srtcp-auth", G_TYPE_STRING, "hmac-sha1-32", NULL);
|
||||||
break;
|
break;
|
||||||
case ER_DTLS_SRTP_AUTH_HMAC_SHA1_80:
|
case GST_DTLS_SRTP_AUTH_HMAC_SHA1_80:
|
||||||
gst_caps_set_simple (key_caps,
|
gst_caps_set_simple (key_caps,
|
||||||
"srtp-auth", G_TYPE_STRING, "hmac-sha1-80",
|
"srtp-auth", G_TYPE_STRING, "hmac-sha1-80",
|
||||||
"srtcp-auth", G_TYPE_STRING, "hmac-sha1-80", NULL);
|
"srtcp-auth", G_TYPE_STRING, "hmac-sha1-80", NULL);
|
||||||
|
@ -394,8 +393,8 @@ on_decoder_request_key (GstElement * srtp_decoder,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_peer_pem (GstElement * srtp_decoder, GParamSpec * pspec,
|
on_pegst_pem (GstElement * srtp_decoder, GParamSpec * pspec,
|
||||||
GstErDtlsSrtpDec * self)
|
GstDtlsSrtpDec * self)
|
||||||
{
|
{
|
||||||
UNUSED (srtp_decoder);
|
UNUSED (srtp_decoder);
|
||||||
UNUSED (pspec);
|
UNUSED (pspec);
|
||||||
|
@ -404,9 +403,9 @@ on_peer_pem (GstElement * srtp_decoder, GParamSpec * pspec,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_dec_remove_dtls_element (GstErDtlsSrtpBin * bin)
|
gst_dtls_srtp_dec_remove_dtls_element (GstDtlsSrtpBin * bin)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpDec *self = GST_ER_DTLS_SRTP_DEC (bin);
|
GstDtlsSrtpDec *self = GST_DTLS_SRTP_DEC (bin);
|
||||||
GstPad *demux_pad;
|
GstPad *demux_pad;
|
||||||
gulong id;
|
gulong id;
|
||||||
|
|
||||||
|
@ -417,7 +416,7 @@ gst_er_dtls_srtp_dec_remove_dtls_element (GstErDtlsSrtpBin * bin)
|
||||||
demux_pad = gst_element_get_static_pad (self->dtls_srtp_demux, "dtls_src");
|
demux_pad = gst_element_get_static_pad (self->dtls_srtp_demux, "dtls_src");
|
||||||
|
|
||||||
id = gst_pad_add_probe (demux_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
id = gst_pad_add_probe (demux_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
||||||
(GstPadProbeCallback) remove_dtls_decoder_probe_callback,
|
(GstPadProbeCallback) remove_dtls_decodgst_probe_callback,
|
||||||
bin->dtls_element, NULL);
|
bin->dtls_element, NULL);
|
||||||
g_return_if_fail (id);
|
g_return_if_fail (id);
|
||||||
bin->dtls_element = NULL;
|
bin->dtls_element = NULL;
|
||||||
|
@ -430,7 +429,7 @@ gst_er_dtls_srtp_dec_remove_dtls_element (GstErDtlsSrtpBin * bin)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
remove_dtls_decoder_probe_callback (GstPad * pad,
|
remove_dtls_decodgst_probe_callback (GstPad * pad,
|
||||||
GstPadProbeInfo * info, GstElement * element)
|
GstPadProbeInfo * info, GstElement * element)
|
||||||
{
|
{
|
||||||
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
|
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
|
||||||
|
|
|
@ -32,30 +32,30 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_SRTP_DEC (gst_er_dtls_srtp_dec_get_type())
|
#define GST_TYPE_DTLS_SRTP_DEC (gst_dtls_srtp_dec_get_type())
|
||||||
#define GST_ER_DTLS_SRTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_SRTP_DEC, GstErDtlsSrtpDec))
|
#define GST_DTLS_SRTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_SRTP_DEC, GstDtlsSrtpDec))
|
||||||
#define GST_ER_DTLS_SRTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_SRTP_DEC, GstErDtlsSrtpDecClass))
|
#define GST_DTLS_SRTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_SRTP_DEC, GstDtlsSrtpDecClass))
|
||||||
#define GST_IS_ER_DTLS_SRTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_SRTP_DEC))
|
#define GST_IS_DTLS_SRTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_SRTP_DEC))
|
||||||
#define GST_IS_ER_DTLS_SRTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_SRTP_DEC))
|
#define GST_IS_DTLS_SRTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_SRTP_DEC))
|
||||||
|
|
||||||
typedef struct _GstErDtlsSrtpDec GstErDtlsSrtpDec;
|
typedef struct _GstDtlsSrtpDec GstDtlsSrtpDec;
|
||||||
typedef struct _GstErDtlsSrtpDecClass GstErDtlsSrtpDecClass;
|
typedef struct _GstDtlsSrtpDecClass GstDtlsSrtpDecClass;
|
||||||
|
|
||||||
struct _GstErDtlsSrtpDec {
|
struct _GstDtlsSrtpDec {
|
||||||
GstErDtlsSrtpBin bin;
|
GstDtlsSrtpBin bin;
|
||||||
|
|
||||||
GstElement *dtls_srtp_demux;
|
GstElement *dtls_srtp_demux;
|
||||||
GstElement *srtp_dec;
|
GstElement *srtp_dec;
|
||||||
GstElement *funnel;
|
GstElement *funnel;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsSrtpDecClass {
|
struct _GstDtlsSrtpDecClass {
|
||||||
GstErDtlsSrtpBinClass parent_class;
|
GstDtlsSrtpBinClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_srtp_dec_get_type(void);
|
GType gst_dtls_srtp_dec_get_type(void);
|
||||||
|
|
||||||
gboolean gst_er_dtls_srtp_dec_plugin_init(GstPlugin *);
|
gboolean gst_dtls_srtp_dec_plugin_init(GstPlugin *);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -52,18 +52,18 @@ GST_STATIC_PAD_TEMPLATE ("dtls_src",
|
||||||
GST_STATIC_CAPS ("application/x-dtls")
|
GST_STATIC_CAPS ("application/x-dtls")
|
||||||
);
|
);
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_er_dtls_srtp_demux_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_gst_dtls_srtp_demux_debug);
|
||||||
#define GST_CAT_DEFAULT er_er_dtls_srtp_demux_debug
|
#define GST_CAT_DEFAULT gst_gst_dtls_srtp_demux_debug
|
||||||
|
|
||||||
#define gst_er_dtls_srtp_demux_parent_class parent_class
|
#define gst_dtls_srtp_demux_parent_class parent_class
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstErDtlsSrtpDemux, gst_er_dtls_srtp_demux,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsSrtpDemux, gst_dtls_srtp_demux,
|
||||||
GST_TYPE_ELEMENT, GST_DEBUG_CATEGORY_INIT (er_er_dtls_srtp_demux_debug,
|
GST_TYPE_ELEMENT, GST_DEBUG_CATEGORY_INIT (gst_gst_dtls_srtp_demux_debug,
|
||||||
"erdtlssrtpdemux", 0, "Ericsson DTLS SRTP Demultiplexer"));
|
"dtlssrtpdemux", 0, "DTLS SRTP Demultiplexer"));
|
||||||
|
|
||||||
static GstFlowReturn sink_chain (GstPad *, GstObject * self, GstBuffer *);
|
static GstFlowReturn sink_chain (GstPad *, GstObject * self, GstBuffer *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_demux_class_init (GstErDtlsSrtpDemuxClass * klass)
|
gst_dtls_srtp_demux_class_init (GstDtlsSrtpDemuxClass * klass)
|
||||||
{
|
{
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ gst_er_dtls_srtp_demux_class_init (GstErDtlsSrtpDemuxClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_demux_init (GstErDtlsSrtpDemux * self)
|
gst_dtls_srtp_demux_init (GstDtlsSrtpDemux * self)
|
||||||
{
|
{
|
||||||
GstPad *sink;
|
GstPad *sink;
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ gst_er_dtls_srtp_demux_init (GstErDtlsSrtpDemux * self)
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpDemux *self = GST_ER_DTLS_SRTP_DEMUX (parent);
|
GstDtlsSrtpDemux *self = GST_DTLS_SRTP_DEMUX (parent);
|
||||||
guint8 first_byte;
|
guint8 first_byte;
|
||||||
|
|
||||||
if (gst_buffer_get_size (buffer) == 0) {
|
if (gst_buffer_get_size (buffer) == 0) {
|
||||||
|
|
|
@ -30,34 +30,34 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_SRTP_DEMUX \
|
#define GST_TYPE_DTLS_SRTP_DEMUX \
|
||||||
(gst_er_dtls_srtp_demux_get_type())
|
(gst_dtls_srtp_demux_get_type())
|
||||||
#define GST_ER_DTLS_SRTP_DEMUX(obj) \
|
#define GST_DTLS_SRTP_DEMUX(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_SRTP_DEMUX, GstErDtlsSrtpDemux))
|
(G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_SRTP_DEMUX, GstDtlsSrtpDemux))
|
||||||
#define GST_ER_DTLS_SRTP_DEMUX_CLASS(klass) \
|
#define GST_DTLS_SRTP_DEMUX_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_SRTP_DEMUX, GstErDtlsSrtpDemuxClass))
|
(G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_SRTP_DEMUX, GstDtlsSrtpDemuxClass))
|
||||||
#define GST_IS_ER_DTLS_SRTP_DEMUX(obj) \
|
#define GST_IS_DTLS_SRTP_DEMUX(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_SRTP_DEMUX))
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_SRTP_DEMUX))
|
||||||
#define GST_IS_ER_DTLS_SRTP_DEMUX_CLASS(klass) \
|
#define GST_IS_DTLS_SRTP_DEMUX_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_SRTP_DEMUX))
|
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_SRTP_DEMUX))
|
||||||
|
|
||||||
typedef struct _GstErDtlsSrtpDemux GstErDtlsSrtpDemux;
|
typedef struct _GstDtlsSrtpDemux GstDtlsSrtpDemux;
|
||||||
typedef struct _GstErDtlsSrtpDemuxClass GstErDtlsSrtpDemuxClass;
|
typedef struct _GstDtlsSrtpDemuxClass GstDtlsSrtpDemuxClass;
|
||||||
|
|
||||||
struct _GstErDtlsSrtpDemux {
|
struct _GstDtlsSrtpDemux {
|
||||||
GstElement element;
|
GstElement element;
|
||||||
|
|
||||||
GstPad *rtp_src;
|
GstPad *rtp_src;
|
||||||
GstPad *dtls_src;
|
GstPad *dtls_src;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsSrtpDemuxClass {
|
struct _GstDtlsSrtpDemuxClass {
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_srtp_demux_get_type(void);
|
GType gst_dtls_srtp_demux_get_type(void);
|
||||||
|
|
||||||
gboolean gst_er_dtls_srtp_demux_plugin_init(GstPlugin *);
|
gboolean gst_dtls_srtp_demux_plugin_init(GstPlugin *);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -56,13 +56,13 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS_ANY);
|
GST_STATIC_CAPS_ANY);
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (er_dtls_srtp_enc_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_dtls_srtp_enc_debug);
|
||||||
#define GST_CAT_DEFAULT er_dtls_srtp_enc_debug
|
#define GST_CAT_DEFAULT gst_dtls_srtp_enc_debug
|
||||||
|
|
||||||
#define gst_er_dtls_srtp_enc_parent_class parent_class
|
#define gst_dtls_srtp_enc_parent_class parent_class
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstErDtlsSrtpEnc, gst_er_dtls_srtp_enc,
|
G_DEFINE_TYPE_WITH_CODE (GstDtlsSrtpEnc, gst_dtls_srtp_enc,
|
||||||
GST_TYPE_ER_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (er_dtls_srtp_enc_debug,
|
GST_TYPE_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (gst_dtls_srtp_enc_debug,
|
||||||
"erdtlssrtpenc", 0, "Ericsson DTLS Decoder"));
|
"dtlssrtpenc", 0, "DTLS Decoder"));
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -86,43 +86,43 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||||
static gboolean transform_enum (GBinding *, const GValue * source_value,
|
static gboolean transform_enum (GBinding *, const GValue * source_value,
|
||||||
GValue * target_value, GEnumClass *);
|
GValue * target_value, GEnumClass *);
|
||||||
|
|
||||||
static void gst_er_dtls_srtp_enc_set_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_enc_set_property (GObject *, guint prop_id,
|
||||||
const GValue *, GParamSpec *);
|
const GValue *, GParamSpec *);
|
||||||
static void gst_er_dtls_srtp_enc_get_property (GObject *, guint prop_id,
|
static void gst_dtls_srtp_enc_get_property (GObject *, guint prop_id,
|
||||||
GValue *, GParamSpec *);
|
GValue *, GParamSpec *);
|
||||||
|
|
||||||
static GstPad *add_ghost_pad (GstElement *, const gchar * name, GstPad *,
|
static GstPad *add_ghost_pad (GstElement *, const gchar * name, GstPad *,
|
||||||
GstPadTemplate *);
|
GstPadTemplate *);
|
||||||
static GstPad *gst_er_dtls_srtp_enc_request_new_pad (GstElement *,
|
static GstPad *gst_dtls_srtp_enc_request_new_pad (GstElement *,
|
||||||
GstPadTemplate *, const gchar * name, const GstCaps *);
|
GstPadTemplate *, const gchar * name, const GstCaps *);
|
||||||
|
|
||||||
static void on_key_received (GObject * encoder, GstErDtlsSrtpEnc *);
|
static void on_key_received (GObject * encoder, GstDtlsSrtpEnc *);
|
||||||
|
|
||||||
static void gst_er_dtls_srtp_enc_remove_dtls_element (GstErDtlsSrtpBin *);
|
static void gst_dtls_srtp_enc_remove_dtls_element (GstDtlsSrtpBin *);
|
||||||
static GstPadProbeReturn remove_dtls_encoder_probe_callback (GstPad *,
|
static GstPadProbeReturn remove_dtls_encodgst_probe_callback (GstPad *,
|
||||||
GstPadProbeInfo *, GstElement *);
|
GstPadProbeInfo *, GstElement *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_enc_class_init (GstErDtlsSrtpEncClass * klass)
|
gst_dtls_srtp_enc_class_init (GstDtlsSrtpEncClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
GstErDtlsSrtpBinClass *dtls_srtp_bin_class;
|
GstDtlsSrtpBinClass *dtls_srtp_bin_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
element_class = (GstElementClass *) klass;
|
element_class = (GstElementClass *) klass;
|
||||||
dtls_srtp_bin_class = (GstErDtlsSrtpBinClass *) klass;
|
dtls_srtp_bin_class = (GstDtlsSrtpBinClass *) klass;
|
||||||
|
|
||||||
gobject_class->set_property =
|
gobject_class->set_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_enc_set_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_enc_set_property);
|
||||||
gobject_class->get_property =
|
gobject_class->get_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_enc_get_property);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_enc_get_property);
|
||||||
|
|
||||||
element_class->request_new_pad =
|
element_class->request_new_pad =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_enc_request_new_pad);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_enc_request_new_pad);
|
||||||
|
|
||||||
dtls_srtp_bin_class->remove_dtls_element =
|
dtls_srtp_bin_class->remove_dtls_element =
|
||||||
GST_DEBUG_FUNCPTR (gst_er_dtls_srtp_enc_remove_dtls_element);
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_enc_remove_dtls_element);
|
||||||
|
|
||||||
signals[SIGNAL_ON_KEY_SET] =
|
signals[SIGNAL_ON_KEY_SET] =
|
||||||
g_signal_new ("on-key-set", G_TYPE_FROM_CLASS (klass),
|
g_signal_new ("on-key-set", G_TYPE_FROM_CLASS (klass),
|
||||||
|
@ -156,7 +156,7 @@ gst_er_dtls_srtp_enc_class_init (GstErDtlsSrtpEncClass * klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_enc_init (GstErDtlsSrtpEnc * self)
|
gst_dtls_srtp_enc_init (GstDtlsSrtpEnc * self)
|
||||||
{
|
{
|
||||||
GstElementClass *klass = GST_ELEMENT_GET_CLASS (GST_ELEMENT (self));
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (GST_ELEMENT (self));
|
||||||
static GEnumClass *cipher_enum_class, *auth_enum_class;
|
static GEnumClass *cipher_enum_class, *auth_enum_class;
|
||||||
|
@ -170,7 +170,7 @@ gst_er_dtls_srtp_enc_init (GstErDtlsSrtpEnc * self)
|
||||||
+--------------------+ | funnel |o---src
|
+--------------------+ | funnel |o---src
|
||||||
| |
|
| |
|
||||||
+--------------------+ | |
|
+--------------------+ | |
|
||||||
data_sink-R-o| erdtlsenc |o---o| |
|
data_sink-R-o| dtlsenc |o---o| |
|
||||||
+--------------------+ +-----------------+
|
+--------------------+ +-----------------+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -181,8 +181,7 @@ gst_er_dtls_srtp_enc_init (GstErDtlsSrtpEnc * self)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g_return_if_fail (self->srtp_enc);
|
g_return_if_fail (self->srtp_enc);
|
||||||
self->bin.dtls_element =
|
self->bin.dtls_element = gst_element_factory_make ("dtlsenc", "dtls-encoder");
|
||||||
gst_element_factory_make ("erdtlsenc", "dtls-encoder");
|
|
||||||
if (!self->bin.dtls_element) {
|
if (!self->bin.dtls_element) {
|
||||||
GST_ERROR_OBJECT (self, "failed to create dtls encoder");
|
GST_ERROR_OBJECT (self, "failed to create dtls encoder");
|
||||||
return;
|
return;
|
||||||
|
@ -257,10 +256,10 @@ transform_enum (GBinding * binding, const GValue * source_value,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_enc_set_property (GObject * object,
|
gst_dtls_srtp_enc_set_property (GObject * object,
|
||||||
guint prop_id, const GValue * value, GParamSpec * pspec)
|
guint prop_id, const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpEnc *self = GST_ER_DTLS_SRTP_ENC (object);
|
GstDtlsSrtpEnc *self = GST_DTLS_SRTP_ENC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_IS_CLIENT:
|
case PROP_IS_CLIENT:
|
||||||
|
@ -278,10 +277,10 @@ gst_er_dtls_srtp_enc_set_property (GObject * object,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_enc_get_property (GObject * object,
|
gst_dtls_srtp_enc_get_property (GObject * object,
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec)
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpEnc *self = GST_ER_DTLS_SRTP_ENC (object);
|
GstDtlsSrtpEnc *self = GST_DTLS_SRTP_ENC (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_IS_CLIENT:
|
case PROP_IS_CLIENT:
|
||||||
|
@ -319,10 +318,10 @@ add_ghost_pad (GstElement * element,
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPad *
|
static GstPad *
|
||||||
gst_er_dtls_srtp_enc_request_new_pad (GstElement * element,
|
gst_dtls_srtp_enc_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpEnc *self = GST_ER_DTLS_SRTP_ENC (element);
|
GstDtlsSrtpEnc *self = GST_DTLS_SRTP_ENC (element);
|
||||||
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
||||||
GstPad *target_pad;
|
GstPad *target_pad;
|
||||||
GstPad *ghost_pad = NULL;
|
GstPad *ghost_pad = NULL;
|
||||||
|
@ -382,9 +381,9 @@ gst_er_dtls_srtp_enc_request_new_pad (GstElement * element,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key_received (GObject * encoder, GstErDtlsSrtpEnc * self)
|
on_key_received (GObject * encoder, GstDtlsSrtpEnc * self)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpBin *bin = GST_ER_DTLS_SRTP_BIN (self);
|
GstDtlsSrtpBin *bin = GST_DTLS_SRTP_BIN (self);
|
||||||
GstBuffer *buffer = NULL;
|
GstBuffer *buffer = NULL;
|
||||||
guint cipher, auth;
|
guint cipher, auth;
|
||||||
|
|
||||||
|
@ -408,10 +407,10 @@ on_key_received (GObject * encoder, GstErDtlsSrtpEnc * self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_er_dtls_srtp_enc_remove_dtls_element (GstErDtlsSrtpBin * bin)
|
gst_dtls_srtp_enc_remove_dtls_element (GstDtlsSrtpBin * bin)
|
||||||
{
|
{
|
||||||
GstErDtlsSrtpEnc *self = GST_ER_DTLS_SRTP_ENC (bin);
|
GstDtlsSrtpEnc *self = GST_DTLS_SRTP_ENC (bin);
|
||||||
GstPad *dtls_sink_pad, *peer_pad;
|
GstPad *dtls_sink_pad, *pegst_pad;
|
||||||
gulong id;
|
gulong id;
|
||||||
guint rtp_cipher = 1, rtcp_cipher = 1, rtp_auth = 1, rtcp_auth = 1;
|
guint rtp_cipher = 1, rtcp_cipher = 1, rtp_auth = 1, rtcp_auth = 1;
|
||||||
|
|
||||||
|
@ -437,26 +436,26 @@ gst_er_dtls_srtp_enc_remove_dtls_element (GstErDtlsSrtpBin * bin)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
peer_pad = gst_pad_get_peer (dtls_sink_pad);
|
pegst_pad = gst_pad_get_peer (dtls_sink_pad);
|
||||||
g_return_if_fail (peer_pad);
|
g_return_if_fail (pegst_pad);
|
||||||
gst_object_unref (dtls_sink_pad);
|
gst_object_unref (dtls_sink_pad);
|
||||||
dtls_sink_pad = NULL;
|
dtls_sink_pad = NULL;
|
||||||
|
|
||||||
id = gst_pad_add_probe (peer_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
id = gst_pad_add_probe (pegst_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
||||||
(GstPadProbeCallback) remove_dtls_encoder_probe_callback,
|
(GstPadProbeCallback) remove_dtls_encodgst_probe_callback,
|
||||||
bin->dtls_element, NULL);
|
bin->dtls_element, NULL);
|
||||||
g_return_if_fail (id);
|
g_return_if_fail (id);
|
||||||
bin->dtls_element = NULL;
|
bin->dtls_element = NULL;
|
||||||
|
|
||||||
gst_pad_push_event (peer_pad,
|
gst_pad_push_event (pegst_pad,
|
||||||
gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
||||||
gst_structure_new_empty ("dummy")));
|
gst_structure_new_empty ("dummy")));
|
||||||
|
|
||||||
gst_object_unref (peer_pad);
|
gst_object_unref (pegst_pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
remove_dtls_encoder_probe_callback (GstPad * pad,
|
remove_dtls_encodgst_probe_callback (GstPad * pad,
|
||||||
GstPadProbeInfo * info, GstElement * element)
|
GstPadProbeInfo * info, GstElement * element)
|
||||||
{
|
{
|
||||||
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
|
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
|
||||||
|
|
|
@ -32,32 +32,32 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_ER_DTLS_SRTP_ENC (gst_er_dtls_srtp_enc_get_type())
|
#define GST_TYPE_DTLS_SRTP_ENC (gst_dtls_srtp_enc_get_type())
|
||||||
#define GST_ER_DTLS_SRTP_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ER_DTLS_SRTP_ENC, GstErDtlsSrtpEnc))
|
#define GST_DTLS_SRTP_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DTLS_SRTP_ENC, GstDtlsSrtpEnc))
|
||||||
#define GST_ER_DTLS_SRTP_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ER_DTLS_SRTP_ENC, GstErDtlsSrtpEncClass))
|
#define GST_DTLS_SRTP_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DTLS_SRTP_ENC, GstDtlsSrtpEncClass))
|
||||||
#define GST_IS_ER_DTLS_SRTP_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ER_DTLS_SRTP_ENC))
|
#define GST_IS_DTLS_SRTP_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DTLS_SRTP_ENC))
|
||||||
#define GST_IS_ER_DTLS_SRTP_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ER_DTLS_SRTP_ENC))
|
#define GST_IS_DTLS_SRTP_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DTLS_SRTP_ENC))
|
||||||
|
|
||||||
typedef struct _GstErDtlsSrtpEnc GstErDtlsSrtpEnc;
|
typedef struct _GstDtlsSrtpEnc GstDtlsSrtpEnc;
|
||||||
typedef struct _GstErDtlsSrtpEncClass GstErDtlsSrtpEncClass;
|
typedef struct _GstDtlsSrtpEncClass GstDtlsSrtpEncClass;
|
||||||
|
|
||||||
struct _GstErDtlsSrtpEnc {
|
struct _GstDtlsSrtpEnc {
|
||||||
GstErDtlsSrtpBin bin;
|
GstDtlsSrtpBin bin;
|
||||||
|
|
||||||
GstElement *srtp_enc;
|
GstElement *srtp_enc;
|
||||||
GstElement *funnel;
|
GstElement *funnel;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstErDtlsSrtpEncClass {
|
struct _GstDtlsSrtpEncClass {
|
||||||
GstErDtlsSrtpBinClass parent_class;
|
GstDtlsSrtpBinClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_er_dtls_srtp_enc_get_type(void);
|
GType gst_dtls_srtp_enc_get_type(void);
|
||||||
|
|
||||||
gboolean gst_er_dtls_srtp_enc_plugin_init(GstPlugin *);
|
gboolean gst_dtls_srtp_enc_plugin_init(GstPlugin *);
|
||||||
|
|
||||||
guint gst_er_dtls_srtp_enc_get_cipher_value_by_nick(const gchar *cipher_nick);
|
guint gst_dtls_srtp_enc_get_ciphgst_value_by_nick(const gchar *ciphgst_nick);
|
||||||
guint gst_er_dtls_srtp_enc_get_auth_value_by_nick(const gchar *auth_nick);
|
guint gst_dtls_srtp_enc_get_auth_value_by_nick(const gchar *auth_nick);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -38,33 +38,20 @@
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
return gst_element_register (plugin, "erdtlsenc", GST_RANK_NONE,
|
return gst_element_register (plugin, "dtlsenc", GST_RANK_NONE,
|
||||||
GST_TYPE_ER_DTLS_ENC)
|
GST_TYPE_DTLS_ENC)
|
||||||
&& gst_element_register (plugin, "erdtlsdec", GST_RANK_NONE,
|
&& gst_element_register (plugin, "dtlsdec", GST_RANK_NONE,
|
||||||
GST_TYPE_ER_DTLS_DEC)
|
GST_TYPE_DTLS_DEC)
|
||||||
&& gst_element_register (plugin, "erdtlssrtpdec", GST_RANK_NONE,
|
&& gst_element_register (plugin, "dtlssrtpdec", GST_RANK_NONE,
|
||||||
GST_TYPE_ER_DTLS_SRTP_DEC)
|
GST_TYPE_DTLS_SRTP_DEC)
|
||||||
&& gst_element_register (plugin, "erdtlssrtpenc", GST_RANK_NONE,
|
&& gst_element_register (plugin, "dtlssrtpenc", GST_RANK_NONE,
|
||||||
GST_TYPE_ER_DTLS_SRTP_ENC)
|
GST_TYPE_DTLS_SRTP_ENC)
|
||||||
&& gst_element_register (plugin, "erdtlssrtpdemux", GST_RANK_NONE,
|
&& gst_element_register (plugin, "dtlssrtpdemux", GST_RANK_NONE,
|
||||||
GST_TYPE_ER_DTLS_SRTP_DEMUX);
|
GST_TYPE_DTLS_SRTP_DEMUX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PACKAGE: this is usually set by autotools depending on some _INIT macro
|
|
||||||
* in configure.ac and then written into and defined in config.h, but we can
|
|
||||||
* just set it ourselves here in case someone doesn't use autotools to
|
|
||||||
* compile this code. GST_PLUGIN_DEFINE needs PACKAGE to be defined.
|
|
||||||
*/
|
|
||||||
#ifndef PACKAGE
|
|
||||||
#define PACKAGE "erdtls"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* gstreamer looks for this structure to register plugins
|
|
||||||
*/
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||||
GST_VERSION_MINOR,
|
GST_VERSION_MINOR,
|
||||||
erdtls,
|
dtls,
|
||||||
"Ericsson DTLS decoder and encoder plugins",
|
"DTLS decoder and encoder plugins",
|
||||||
plugin_init,
|
plugin_init, PACKAGE_VERSION, "BSD", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|
||||||
PACKAGE_VERSION,
|
|
||||||
"BSD", "OpenWebRTC GStreamer plugins", "http://www.openwebrtc.io/")
|
|
||||||
|
|
Loading…
Reference in a new issue