diff options
author | Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> | 2017-02-22 02:17:35 +0100 |
---|---|---|
committer | Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> | 2017-02-23 03:00:26 +0100 |
commit | ab2dc21b9bfa5a7b54e77f260e3e920051711778 (patch) | |
tree | 41e05222fcd50d1ebf09f4c356da107b4b812a2e /ext | |
parent | 962d747c3af4bc7140eb5a54459402acdb7d08da (diff) | |
download | gstreamer-plugins-bad-ab2dc21b9bfa5a7b54e77f260e3e920051711778.tar.gz |
webrtcdsp: expose new properties.
This gives the user more control over the gain control
and experimental gain control behaviour.
https://bugzilla.gnome.org/show_bug.cgi?id=779103
Diffstat (limited to 'ext')
-rw-r--r-- | ext/webrtcdsp/gstwebrtcdsp.cpp | 131 |
1 files changed, 127 insertions, 4 deletions
diff --git a/ext/webrtcdsp/gstwebrtcdsp.cpp b/ext/webrtcdsp/gstwebrtcdsp.cpp index b6b8660f5..58ee9b632 100644 --- a/ext/webrtcdsp/gstwebrtcdsp.cpp +++ b/ext/webrtcdsp/gstwebrtcdsp.cpp @@ -78,6 +78,12 @@ GST_DEBUG_CATEGORY (webrtc_dsp_debug); #define GST_CAT_DEFAULT (webrtc_dsp_debug) +#define DEFAULT_TARGET_LEVEL_DBFS 3 +#define DEFAULT_COMPRESSION_GAIN_DB 9 +#define DEFAULT_STARTUP_MIN_VOLUME 12 +#define DEFAULT_LIMITER TRUE +#define DEFAULT_GAIN_CONTROL_MODE webrtc::GainControl::kAdaptiveDigital + static GstStaticPadTemplate gst_webrtc_dsp_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -145,6 +151,26 @@ gst_webrtc_noise_suppression_level_get_type (void) return suppression_level_type; } +typedef webrtc::GainControl::Mode GstWebrtcGainControlMode; +#define GST_TYPE_WEBRTC_GAIN_CONTROL_MODE \ + (gst_webrtc_gain_control_mode_get_type ()) +static GType +gst_webrtc_gain_control_mode_get_type (void) +{ + static GType gain_control_mode_type = 0; + static const GEnumValue mode_types[] = { + {webrtc::GainControl::kAdaptiveDigital, "Adaptive Digital", "adaptive-digital"}, + {webrtc::GainControl::kFixedDigital, "Fixed Digital", "fixed-digital"}, + {0, NULL, NULL} + }; + + if (!gain_control_mode_type) { + gain_control_mode_type = + g_enum_register_static ("GstWebrtcGainControlMode", mode_types); + } + return gain_control_mode_type; +} + enum { PROP_0, @@ -157,7 +183,12 @@ enum PROP_GAIN_CONTROL, PROP_EXPERIMENTAL_AGC, PROP_EXTENDED_FILTER, - PROP_DELAY_AGNOSTIC + PROP_DELAY_AGNOSTIC, + PROP_TARGET_LEVEL_DBFS, + PROP_COMPRESSION_GAIN_DB, + PROP_STARTUP_MIN_VOLUME, + PROP_LIMITER, + PROP_GAIN_CONTROL_MODE }; /** @@ -191,6 +222,11 @@ struct _GstWebrtcDsp gboolean experimental_agc; gboolean extended_filter; gboolean delay_agnostic; + gint target_level_dbfs; + gint compression_gain_db; + gint startup_min_volume; + gboolean limiter; + webrtc::GainControl::Mode gain_control_mode; }; G_DEFINE_TYPE (GstWebrtcDsp, gst_webrtc_dsp, GST_TYPE_AUDIO_FILTER); @@ -408,7 +444,7 @@ gst_webrtc_dsp_start (GstBaseTransform * btrans) config.Set < webrtc::ExtendedFilter > (new webrtc::ExtendedFilter (self->extended_filter)); config.Set < webrtc::ExperimentalAgc > - (new webrtc::ExperimentalAgc (self->experimental_agc)); + (new webrtc::ExperimentalAgc (self->experimental_agc, self->startup_min_volume)); config.Set < webrtc::DelayAgnostic > (new webrtc::DelayAgnostic (self->delay_agnostic)); @@ -505,8 +541,21 @@ gst_webrtc_dsp_setup (GstAudioFilter * filter, const GstAudioInfo * info) } if (self->gain_control) { - GST_DEBUG_OBJECT (self, "Enabling Digital Gain Control"); - apm->gain_control ()->set_mode (webrtc::GainControl::kAdaptiveDigital); + GEnumClass *mode_class = (GEnumClass *) + g_type_class_ref (GST_TYPE_WEBRTC_GAIN_CONTROL_MODE); + + GST_DEBUG_OBJECT (self, "Enabling Digital Gain Control, target level " + "dBFS %d, compression gain dB %d, limiter %senabled, mode: %s", + self->target_level_dbfs, self->compression_gain_db, + self->limiter ? "" : "NOT ", + g_enum_get_value (mode_class, self->gain_control_mode)->value_name); + + g_type_class_unref (mode_class); + + apm->gain_control ()->set_mode (self->gain_control_mode); + apm->gain_control ()->set_target_level_dbfs (self->target_level_dbfs); + apm->gain_control ()->set_compression_gain_db (self->compression_gain_db); + apm->gain_control ()->enable_limiter (self->limiter); apm->gain_control ()->Enable (true); } @@ -603,6 +652,22 @@ gst_webrtc_dsp_set_property (GObject * object, case PROP_DELAY_AGNOSTIC: self->delay_agnostic = g_value_get_boolean (value); break; + case PROP_TARGET_LEVEL_DBFS: + self->target_level_dbfs = g_value_get_int (value); + break; + case PROP_COMPRESSION_GAIN_DB: + self->compression_gain_db = g_value_get_int (value); + break; + case PROP_STARTUP_MIN_VOLUME: + self->startup_min_volume = g_value_get_int (value); + break; + case PROP_LIMITER: + self->limiter = g_value_get_boolean (value); + break; + case PROP_GAIN_CONTROL_MODE: + self->gain_control_mode = + (GstWebrtcGainControlMode) g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -648,6 +713,21 @@ gst_webrtc_dsp_get_property (GObject * object, case PROP_DELAY_AGNOSTIC: g_value_set_boolean (value, self->delay_agnostic); break; + case PROP_TARGET_LEVEL_DBFS: + g_value_set_int (value, self->target_level_dbfs); + break; + case PROP_COMPRESSION_GAIN_DB: + g_value_set_int (value, self->compression_gain_db); + break; + case PROP_STARTUP_MIN_VOLUME: + g_value_set_int (value, self->startup_min_volume); + break; + case PROP_LIMITER: + g_value_set_boolean (value, self->limiter); + break; + case PROP_GAIN_CONTROL_MODE: + g_value_set_enum (value, self->gain_control_mode); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -784,6 +864,49 @@ gst_webrtc_dsp_class_init (GstWebrtcDspClass * klass) "Enable or disable the delay agnostic mode.", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + + g_object_class_install_property (gobject_class, + PROP_TARGET_LEVEL_DBFS, + g_param_spec_int ("target-level-dbfs", "Target Level dBFS", + "Sets the target peak |level| (or envelope) of the gain control in " + "dBFS (decibels from digital full-scale).", + 0, 31, DEFAULT_TARGET_LEVEL_DBFS, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + + g_object_class_install_property (gobject_class, + PROP_COMPRESSION_GAIN_DB, + g_param_spec_int ("compression-gain-db", "Compression Gain dB", + "Sets the maximum |gain| the digital compression stage may apply, " + "in dB.", + 0, 90, DEFAULT_COMPRESSION_GAIN_DB, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + + g_object_class_install_property (gobject_class, + PROP_STARTUP_MIN_VOLUME, + g_param_spec_int ("startup-min-volume", "Startup Minimum Volume", + "At startup the experimental AGC moves the microphone volume up to " + "|startup_min_volume| if the current microphone volume is set too " + "low. No effect if experimental-agc isn't enabled.", + 12, 255, DEFAULT_STARTUP_MIN_VOLUME, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + + g_object_class_install_property (gobject_class, + PROP_LIMITER, + g_param_spec_boolean ("limiter", "Limiter", + "When enabled, the compression stage will hard limit the signal to " + "the target level. Otherwise, the signal will be compressed but not " + "limited above the target level.", + DEFAULT_LIMITER, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + + g_object_class_install_property (gobject_class, + PROP_GAIN_CONTROL_MODE, + g_param_spec_enum ("gain-control-mode", "Gain Control Mode", + "Controls the mode of the compression stage", + GST_TYPE_WEBRTC_GAIN_CONTROL_MODE, + DEFAULT_GAIN_CONTROL_MODE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); } static gboolean |