mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
245 lines
7.7 KiB
C
245 lines
7.7 KiB
C
/*
|
|
* Copyright (c) 2014, Ericsson AB. All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this
|
|
* list of conditions and the following disclaimer in the documentation and/or other
|
|
* materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
* OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "gstdtlssrtpbin.h"
|
|
|
|
#define gst_dtls_srtp_bin_parent_class parent_class
|
|
G_DEFINE_ABSTRACT_TYPE (GstDtlsSrtpBin, gst_dtls_srtp_bin, GST_TYPE_BIN);
|
|
|
|
enum
|
|
{
|
|
PROP_0,
|
|
PROP_CONNECTION_ID,
|
|
PROP_KEY,
|
|
PROP_SRTP_AUTH,
|
|
PROP_SRTP_CIPHER,
|
|
PROP_SRTCP_AUTH,
|
|
PROP_SRTCP_CIPHER,
|
|
NUM_PROPERTIES
|
|
};
|
|
|
|
static GParamSpec *properties[NUM_PROPERTIES];
|
|
|
|
#define DEFAULT_CONNECTION_ID NULL
|
|
#define DEFAULT_KEY NULL
|
|
#define DEFAULT_SRTP_AUTH NULL
|
|
#define DEFAULT_SRTP_CIPHER NULL
|
|
#define DEFAULT_SRTCP_AUTH NULL
|
|
#define DEFAULT_SRTCP_CIPHER NULL
|
|
|
|
static void gst_dtls_srtp_bin_finalize (GObject *);
|
|
static void gst_dtls_srtp_bin_set_property (GObject *, guint prop_id,
|
|
const GValue *, GParamSpec *);
|
|
static void gst_dtls_srtp_bin_get_property (GObject *, guint prop_id,
|
|
GValue *, GParamSpec *);
|
|
|
|
static void
|
|
gst_dtls_srtp_bin_class_init (GstDtlsSrtpBinClass * klass)
|
|
{
|
|
GObjectClass *gobject_class;
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_finalize);
|
|
gobject_class->set_property =
|
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_set_property);
|
|
gobject_class->get_property =
|
|
GST_DEBUG_FUNCPTR (gst_dtls_srtp_bin_get_property);
|
|
|
|
klass->remove_dtls_element = NULL;
|
|
|
|
properties[PROP_CONNECTION_ID] =
|
|
g_param_spec_string ("connection-id",
|
|
"Connection id",
|
|
"Every encoder/decoder pair should have the same, unique, connection-id",
|
|
DEFAULT_CONNECTION_ID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
|
|
|
properties[PROP_KEY] =
|
|
g_param_spec_boxed ("key",
|
|
"Key",
|
|
"SRTP master key, if this property is set, DTLS will be disabled",
|
|
GST_TYPE_BUFFER,
|
|
G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS);
|
|
|
|
properties[PROP_SRTP_CIPHER] =
|
|
g_param_spec_string ("srtp-cipher",
|
|
"SRTP Cipher",
|
|
"SRTP cipher name, should be 'null' or 'aes-128-icm', "
|
|
"if this property is set, DTLS will be disabled",
|
|
DEFAULT_SRTP_CIPHER,
|
|
G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS);
|
|
|
|
properties[PROP_SRTCP_CIPHER] =
|
|
g_param_spec_string ("srtcp-cipher",
|
|
"SRTCP Cipher",
|
|
"SRTCP cipher name, should be 'null' or 'aes-128-icm', "
|
|
"if this property is set, DTLS will be disabled",
|
|
DEFAULT_SRTCP_CIPHER,
|
|
G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS);
|
|
|
|
properties[PROP_SRTP_AUTH] =
|
|
g_param_spec_string ("srtp-auth",
|
|
"SRTP Auth",
|
|
"SRTP auth name, should be 'null', 'hmac-sha1-32' or 'hmac-sha1-80', "
|
|
"if this property is set, DTLS will be disabled",
|
|
DEFAULT_SRTP_AUTH,
|
|
G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS);
|
|
|
|
properties[PROP_SRTCP_AUTH] =
|
|
g_param_spec_string ("srtcp-auth",
|
|
"SRTCP Auth",
|
|
"SRTCP auth name, should be 'null', 'hmac-sha1-32' or 'hmac-sha1-80', "
|
|
"if this property is set, DTLS will be disabled",
|
|
DEFAULT_SRTCP_AUTH,
|
|
G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS);
|
|
|
|
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
|
|
|
|
gst_type_mark_as_plugin_api (GST_TYPE_DTLS_SRTP_BIN, 0);
|
|
}
|
|
|
|
static void
|
|
gst_dtls_srtp_bin_init (GstDtlsSrtpBin * self)
|
|
{
|
|
self->key = NULL;
|
|
self->key_is_set = FALSE;
|
|
self->srtp_auth = NULL;
|
|
self->srtp_cipher = NULL;
|
|
self->srtcp_auth = NULL;
|
|
self->srtcp_cipher = NULL;
|
|
}
|
|
|
|
static void
|
|
gst_dtls_srtp_bin_finalize (GObject * object)
|
|
{
|
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
|
|
|
if (self->key) {
|
|
gst_buffer_unref (self->key);
|
|
self->key = NULL;
|
|
}
|
|
g_free (self->srtp_auth);
|
|
self->srtp_auth = NULL;
|
|
g_free (self->srtp_cipher);
|
|
self->srtp_cipher = NULL;
|
|
g_free (self->srtcp_auth);
|
|
self->srtcp_auth = NULL;
|
|
g_free (self->srtcp_cipher);
|
|
self->srtcp_cipher = NULL;
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
}
|
|
|
|
static void
|
|
gst_dtls_srtp_bin_set_property (GObject * object,
|
|
guint prop_id, const GValue * value, GParamSpec * pspec)
|
|
{
|
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
|
GstDtlsSrtpBinClass *klass = GST_DTLS_SRTP_BIN_GET_CLASS (self);
|
|
|
|
switch (prop_id) {
|
|
case PROP_CONNECTION_ID:
|
|
if (self->dtls_element) {
|
|
g_object_set_property (G_OBJECT (self->dtls_element), "connection-id",
|
|
value);
|
|
} else {
|
|
g_warning ("tried to set connection-id after disabling DTLS");
|
|
}
|
|
break;
|
|
case PROP_KEY:
|
|
if (self->key) {
|
|
gst_buffer_unref (self->key);
|
|
}
|
|
self->key = g_value_dup_boxed (value);
|
|
self->key_is_set = TRUE;
|
|
klass->remove_dtls_element (self);
|
|
break;
|
|
case PROP_SRTP_AUTH:
|
|
g_free (self->srtp_auth);
|
|
self->srtp_auth = g_value_dup_string (value);
|
|
klass->remove_dtls_element (self);
|
|
break;
|
|
case PROP_SRTP_CIPHER:
|
|
g_free (self->srtp_cipher);
|
|
self->srtp_cipher = g_value_dup_string (value);
|
|
klass->remove_dtls_element (self);
|
|
break;
|
|
case PROP_SRTCP_AUTH:
|
|
g_free (self->srtcp_auth);
|
|
self->srtcp_auth = g_value_dup_string (value);
|
|
klass->remove_dtls_element (self);
|
|
break;
|
|
case PROP_SRTCP_CIPHER:
|
|
g_free (self->srtcp_cipher);
|
|
self->srtcp_cipher = g_value_dup_string (value);
|
|
klass->remove_dtls_element (self);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
|
|
}
|
|
}
|
|
|
|
static void
|
|
gst_dtls_srtp_bin_get_property (GObject * object,
|
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
|
{
|
|
GstDtlsSrtpBin *self = GST_DTLS_SRTP_BIN (object);
|
|
|
|
switch (prop_id) {
|
|
case PROP_CONNECTION_ID:
|
|
if (self->dtls_element) {
|
|
g_object_get_property (G_OBJECT (self->dtls_element), "connection-id",
|
|
value);
|
|
} else {
|
|
GST_WARNING_OBJECT (self,
|
|
"tried to get connection-id after disabling DTLS");
|
|
}
|
|
break;
|
|
case PROP_KEY:
|
|
if (self->key) {
|
|
g_value_set_boxed (value, self->key);
|
|
}
|
|
break;
|
|
case PROP_SRTP_AUTH:
|
|
g_value_set_string (value, self->srtp_auth);
|
|
break;
|
|
case PROP_SRTP_CIPHER:
|
|
g_value_set_string (value, self->srtp_cipher);
|
|
break;
|
|
case PROP_SRTCP_AUTH:
|
|
g_value_set_string (value, self->srtcp_auth);
|
|
break;
|
|
case PROP_SRTCP_CIPHER:
|
|
g_value_set_string (value, self->srtcp_cipher);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
|
|
}
|
|
}
|