mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
equalizer: fix filter history usage. Fixes #597397
The process functions where overwriting the history for each channel. Also pull some static things out of the inner loop.
This commit is contained in:
parent
0040d01265
commit
7b6e594b69
1 changed files with 15 additions and 17 deletions
|
@ -577,17 +577,16 @@ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \
|
||||||
guint size, guint channels) \
|
guint size, guint channels) \
|
||||||
{ \
|
{ \
|
||||||
guint frames = size / channels / sizeof (TYPE); \
|
guint frames = size / channels / sizeof (TYPE); \
|
||||||
guint i, c, f; \
|
guint i, c, f, nf = equ->freq_band_count; \
|
||||||
BIG_TYPE cur; \
|
BIG_TYPE cur; \
|
||||||
|
GstIirEqualizerBand **filters = equ->bands; \
|
||||||
\
|
\
|
||||||
for (i = 0; i < frames; i++) { \
|
for (i = 0; i < frames; i++) { \
|
||||||
|
SecondOrderHistory ## TYPE *history = equ->history; \
|
||||||
for (c = 0; c < channels; c++) { \
|
for (c = 0; c < channels; c++) { \
|
||||||
SecondOrderHistory ## TYPE *history = equ->history; \
|
|
||||||
cur = *((TYPE *) data); \
|
cur = *((TYPE *) data); \
|
||||||
for (f = 0; f < equ->freq_band_count; f++) { \
|
for (f = 0; f < nf; f++) { \
|
||||||
GstIirEqualizerBand *filter = equ->bands[f]; \
|
cur = one_step_ ## TYPE (filters[f], history, cur); \
|
||||||
\
|
|
||||||
cur = one_step_ ## TYPE (filter, history, cur); \
|
|
||||||
history++; \
|
history++; \
|
||||||
} \
|
} \
|
||||||
cur = CLAMP (cur, MIN_VAL, MAX_VAL); \
|
cur = CLAMP (cur, MIN_VAL, MAX_VAL); \
|
||||||
|
@ -597,18 +596,18 @@ guint size, guint channels) \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \
|
#define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \
|
||||||
typedef struct { \
|
typedef struct { \
|
||||||
TYPE x1, x2; /* history of input values for a filter */ \
|
TYPE x1, x2; /* history of input values for a filter */ \
|
||||||
TYPE y1, y2; /* history of output values for a filter */ \
|
TYPE y1, y2; /* history of output values for a filter */ \
|
||||||
} SecondOrderHistory ## TYPE; \
|
} SecondOrderHistory ## TYPE; \
|
||||||
\
|
\
|
||||||
static inline TYPE \
|
static inline TYPE \
|
||||||
one_step_ ## TYPE (GstIirEqualizerBand *filter, \
|
one_step_ ## TYPE (GstIirEqualizerBand *filter, \
|
||||||
SecondOrderHistory ## TYPE *history, TYPE input) \
|
SecondOrderHistory ## TYPE *history, TYPE input) \
|
||||||
{ \
|
{ \
|
||||||
/* calculate output */ \
|
/* calculate output */ \
|
||||||
TYPE output = filter->a0 * input + filter->a1 * history->x1 + \
|
TYPE output = filter->a0 * input + filter->a1 * history->x1 + \
|
||||||
filter->a2 * history->x2 + filter->b1 * history->y1 + \
|
filter->a2 * history->x2 + filter->b1 * history->y1 + \
|
||||||
filter->b2 * history->y2; \
|
filter->b2 * history->y2; \
|
||||||
/* update history */ \
|
/* update history */ \
|
||||||
|
@ -628,17 +627,16 @@ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \
|
||||||
guint size, guint channels) \
|
guint size, guint channels) \
|
||||||
{ \
|
{ \
|
||||||
guint frames = size / channels / sizeof (TYPE); \
|
guint frames = size / channels / sizeof (TYPE); \
|
||||||
guint i, c, f; \
|
guint i, c, f, nf = equ->freq_band_count; \
|
||||||
TYPE cur; \
|
TYPE cur; \
|
||||||
|
GstIirEqualizerBand **filters = equ->bands; \
|
||||||
\
|
\
|
||||||
for (i = 0; i < frames; i++) { \
|
for (i = 0; i < frames; i++) { \
|
||||||
|
SecondOrderHistory ## TYPE *history = equ->history; \
|
||||||
for (c = 0; c < channels; c++) { \
|
for (c = 0; c < channels; c++) { \
|
||||||
SecondOrderHistory ## TYPE *history = equ->history; \
|
|
||||||
cur = *((TYPE *) data); \
|
cur = *((TYPE *) data); \
|
||||||
for (f = 0; f < equ->freq_band_count; f++) { \
|
for (f = 0; f < nf; f++) { \
|
||||||
GstIirEqualizerBand *filter = equ->bands[f]; \
|
cur = one_step_ ## TYPE (filters[f], history, cur); \
|
||||||
\
|
|
||||||
cur = one_step_ ## TYPE (filter, history, cur); \
|
|
||||||
history++; \
|
history++; \
|
||||||
} \
|
} \
|
||||||
*((TYPE *) data) = (TYPE) cur; \
|
*((TYPE *) data) = (TYPE) cur; \
|
||||||
|
|
Loading…
Reference in a new issue