From c17d49ee20e40211c35ec86d50d4669ed68d0f38 Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Fri, 30 May 2008 11:03:57 +0000 Subject: gst/equalizer/gstiirequalizer.*: Update the filter coefficients only when needed in the transform_ip function and cor... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_init), (setup_filter), (set_passthrough), (update_coefficients), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_transform_ip): * gst/equalizer/gstiirequalizer.h: Update the filter coefficients only when needed in the transform_ip function and correctly set the element into passthrough mode if the gain of all bands is 0. --- gst/equalizer/gstiirequalizer.c | 69 +++++++++++++++++++++++++++++++---------- gst/equalizer/gstiirequalizer.h | 2 ++ 2 files changed, 55 insertions(+), 16 deletions(-) (limited to 'gst/equalizer') diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c index 1cde3247..b0954549 100644 --- a/gst/equalizer/gstiirequalizer.c +++ b/gst/equalizer/gstiirequalizer.c @@ -120,8 +120,11 @@ struct _GstIirEqualizerBandClass }; static GType gst_iir_equalizer_band_get_type (void); + static void setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band); +static void set_passthrough (GstIirEqualizer * equ); + static void gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -138,10 +141,10 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, GstIirEqualizer *equ = GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); + equ->need_new_coefficients = equ->need_new_coefficients || + (band->gain != gain); band->gain = gain; - if (GST_AUDIO_FILTER (equ)->format.rate) { - setup_filter (equ, band); - } + gst_object_unref (equ); GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain); } @@ -156,10 +159,9 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, GstIirEqualizer *equ = GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); + equ->need_new_coefficients = equ->need_new_coefficients || + (band->freq != freq); band->freq = freq; - if (GST_AUDIO_FILTER (equ)->format.rate) { - setup_filter (equ, band); - } gst_object_unref (equ); GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq); } @@ -174,10 +176,9 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, GstIirEqualizer *equ = GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); + equ->need_new_coefficients = equ->need_new_coefficients || + (band->width != width); band->width = width; - if (GST_AUDIO_FILTER (equ)->format.rate) { - setup_filter (equ, band); - } gst_object_unref (equ); GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width); } @@ -310,6 +311,7 @@ static void gst_iir_equalizer_base_init (gpointer g_class) { GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (g_class); + GstCaps *caps; caps = gst_caps_from_string (ALLOWED_CAPS); @@ -321,7 +323,9 @@ static void gst_iir_equalizer_class_init (GstIirEqualizerClass * klass) { GstAudioFilterClass *audio_filter_class = (GstAudioFilterClass *) klass; + GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_iir_equalizer_finalize; @@ -333,13 +337,14 @@ gst_iir_equalizer_class_init (GstIirEqualizerClass * klass) static void gst_iir_equalizer_init (GstIirEqualizer * eq, GstIirEqualizerClass * g_class) { - /* nothing to do here */ + eq->need_new_coefficients = TRUE; } static void gst_iir_equalizer_finalize (GObject * object) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + gint i; for (i = 0; i < equ->freq_band_count; i++) { @@ -385,7 +390,9 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) */ { gdouble gain, omega, bw; + gdouble edge_gain, gamma; + gdouble alpha, beta; @@ -414,6 +421,7 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) band->a2 = 0.0; band->b1 = 0.0; band->b2 = 0.0; + gain = 1.0; goto out; } else { bw = 2.0 * M_PI * (band->width / GST_AUDIO_FILTER (equ)->format.rate); @@ -439,11 +447,38 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) } } +static void +set_passthrough (GstIirEqualizer * equ) +{ + gint i; + + gboolean passthrough = TRUE; + + for (i = 0; i < equ->freq_band_count; i++) { + passthrough = passthrough && (equ->bands[i]->gain == 0.0); + } + + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (equ), passthrough); + GST_DEBUG ("Passthrough mode: %d\n", passthrough); +} + +static void +update_coefficients (GstIirEqualizer * equ) +{ + gint i; + + for (i = 0; i < equ->freq_band_count; i++) { + setup_filter (equ, equ->bands[i]); + } +} + void gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count) { guint old_count, i; + gdouble freq0, freq1, step; + gchar name[20]; old_count = equ->freq_band_count; @@ -503,12 +538,7 @@ gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count) freq0 = freq1; } - - if (GST_AUDIO_FILTER (equ)->format.rate) { - for (i = 0; i < new_count; i++) { - setup_filter (equ, equ->bands[i]); - } - } + equ->need_new_coefficients = TRUE; } /* start of code that is type specific */ @@ -572,7 +602,9 @@ static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) { GstAudioFilter *filter = GST_AUDIO_FILTER (btrans); + GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans); + GstClockTime timestamp; if (gst_base_transform_is_passthrough (btrans)) @@ -581,6 +613,11 @@ gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL)) return GST_FLOW_NOT_NEGOTIATED; + if (equ->need_new_coefficients) { + update_coefficients (equ); + set_passthrough (equ); + } + timestamp = GST_BUFFER_TIMESTAMP (buf); timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); diff --git a/gst/equalizer/gstiirequalizer.h b/gst/equalizer/gstiirequalizer.h index 6e7839a3..37ee8725 100644 --- a/gst/equalizer/gstiirequalizer.h +++ b/gst/equalizer/gstiirequalizer.h @@ -60,6 +60,8 @@ struct _GstIirEqualizer gpointer history; guint history_size; + gboolean need_new_coefficients; + ProcessFunc process; }; -- cgit