From patchwork Thu Jun 11 16:12:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 20289 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 022B6449705 for ; Thu, 11 Jun 2020 19:20:00 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CDE5868B120; Thu, 11 Jun 2020 19:19:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D67E968AE6F for ; Thu, 11 Jun 2020 19:19:53 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id y20so5620325wmi.2 for ; Thu, 11 Jun 2020 09:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=vijHILUzah9lntITfE05an1FeBIkonXysDB1ryHzpSk=; b=mLTlV9Pz+824MxloMEHUyGeeyCph58QE2XOiiR1AAb4/BXYLrUqfrHL3B9iTORSIjW PZW/i0JKZ3Zmrl3bn4aV1QEKVsXhNbUSXaHa6F1cRhhijBmrat8TnEkGrodWCq0062aB iItr89BUHWO4RzHc48Clc/Ac8wdijeOd7K8MsAQ1GyKwFkIrvV9ZYYznbya4VtMiLnKP QS8hV56UFu69YfZdotNQxMfZDh6O2xkaXFIEMTlbzsEjpch89nhdLWOoHrLb77ocXmyI vWpLyupiL2cHXPNB4sMR6dUKeIMc5EHzngnym7CL1zxvNuNbORelLCaai+UwbjKBAhJi WbZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=vijHILUzah9lntITfE05an1FeBIkonXysDB1ryHzpSk=; b=UGhVf5/uD1Sm9BeDgflxvd5csE2qdX8BG+Fs9FDhS9J0rk/Im5uonylMEZHd/dEOMn jxhdidwlvf3GOjHEmIPN07oIAXSNq4VVhqBWV2Lb9pb5cYsVrz3rCLGDb75GYk6FWEjL 23CDahIOkqiiL71jvnWoLN89udv4PJCU3imJW7gVPj80LhNv2EZ4BvfLfrmfmS4r2uqB 9VD0027SxI2dc42PT03JrrLhPdZF/LgzQsWAyFopzu0yM4zVS1R92Ia00DsV6BMSRHpn ma9LEzKYm0lpFC4UKVPFBwtIjyYLJxkUy8EU62Ksp8zsoJWAudMvXNI1xPXP+pB6DaLC pGDg== X-Gm-Message-State: AOAM533ToPU3aaDM8Rv7Dn0Xw3VTTNeNDs11JidArQsLXWy2Hta7X3uu /OFUzz2kCpeU0Emo1NWhgkgPIe9dozM= X-Google-Smtp-Source: ABdhPJyiqMvgQyW5ULtI1j7Cltt6oBIld0QcQhGB1sBi3H148iZO4MNXSRfT1XO+A8d8r4PqjO3fVQ== X-Received: by 2002:a7b:c4cc:: with SMTP id g12mr8781954wmk.171.1591891962956; Thu, 11 Jun 2020 09:12:42 -0700 (PDT) Received: from localhost.localdomain ([37.244.249.74]) by smtp.gmail.com with ESMTPSA id 104sm6074960wrl.25.2020.06.11.09.12.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 09:12:42 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Jun 2020 18:12:25 +0200 Message-Id: <20200611161227.5622-5-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611161227.5622-1-onemda@gmail.com> References: <20200611161227.5622-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 5/7] avfilter/af_biquads: refactor code X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavfilter/af_biquads.c | 279 ++++++++++----------------------------- 1 file changed, 68 insertions(+), 211 deletions(-) diff --git a/libavfilter/af_biquads.c b/libavfilter/af_biquads.c index f3ef3660cc..c998f3e982 100644 --- a/libavfilter/af_biquads.c +++ b/libavfilter/af_biquads.c @@ -138,13 +138,14 @@ typedef struct BiquadsContext { int hop_size; double *window_func_lut; - void (*filter)(struct BiquadsContext *s, const void *ibuf, void *obuf, int len, + void (*filter)(struct BiquadsContext *s, const void *ibuf, void *obuf, void *dst, int len, double *i1, double *i2, double *o1, double *o2, double b0, double b1, double b2, double a1, double a2, int *clippings, int disabled); void (*reverse_filter)(struct BiquadsContext *s, const void *ibuf, void *obuf, void *dst, int len, double *i1, double *i2, double *o1, double *o2, - double b0, double b1, double b2, double a1, double a2, int *clippings); + double b0, double b1, double b2, double a1, double a2, int *clippings, + int disabled); } BiquadsContext; static av_cold int init(AVFilterContext *ctx) @@ -195,97 +196,15 @@ static int query_formats(AVFilterContext *ctx) return ff_set_common_samplerates(ctx, formats); } -#define BIQUAD_FILTER(name, type, min, max, need_clipping) \ +#define BIQUAD_FILTER(name, type, min, max, need_clipping, reverse) \ static void biquad_## name (BiquadsContext *s, \ - const void *input, void *output, int len, \ - double *in1, double *in2, \ - double *out1, double *out2, \ - double b0, double b1, double b2, \ - double a1, double a2, int *clippings, \ - int disabled) \ -{ \ - const type *ibuf = input; \ - type *obuf = output; \ - double i1 = *in1; \ - double i2 = *in2; \ - double o1 = *out1; \ - double o2 = *out2; \ - double wet = s->mix; \ - double dry = 1. - wet; \ - double out; \ - int i; \ - a1 = -a1; \ - a2 = -a2; \ - \ - for (i = 0; i+1 < len; i++) { \ - o2 = i2 * b2 + i1 * b1 + ibuf[i] * b0 + o2 * a2 + o1 * a1; \ - i2 = ibuf[i]; \ - out = o2 * wet + i2 * dry; \ - if (disabled) { \ - obuf[i] = i2; \ - } else if (need_clipping && out < min) { \ - (*clippings)++; \ - obuf[i] = min; \ - } else if (need_clipping && out > max) { \ - (*clippings)++; \ - obuf[i] = max; \ - } else { \ - obuf[i] = out; \ - } \ - i++; \ - o1 = i1 * b2 + i2 * b1 + ibuf[i] * b0 + o1 * a2 + o2 * a1; \ - i1 = ibuf[i]; \ - out = o1 * wet + i1 * dry; \ - if (disabled) { \ - obuf[i] = i1; \ - } else if (need_clipping && out < min) { \ - (*clippings)++; \ - obuf[i] = min; \ - } else if (need_clipping && out > max) { \ - (*clippings)++; \ - obuf[i] = max; \ - } else { \ - obuf[i] = out; \ - } \ - } \ - if (i < len) { \ - double o0 = ibuf[i] * b0 + i1 * b1 + i2 * b2 + o1 * a1 + o2 * a2; \ - i2 = i1; \ - i1 = ibuf[i]; \ - o2 = o1; \ - o1 = o0; \ - out = o0 * wet + i1 * dry; \ - if (disabled) { \ - obuf[i] = i1; \ - } else if (need_clipping && out < min) { \ - (*clippings)++; \ - obuf[i] = min; \ - } else if (need_clipping && out > max) { \ - (*clippings)++; \ - obuf[i] = max; \ - } else { \ - obuf[i] = out; \ - } \ - } \ - *in1 = i1; \ - *in2 = i2; \ - *out1 = o1; \ - *out2 = o2; \ -} - -BIQUAD_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_FILTER(flt, float, -1., 1., 0) -BIQUAD_FILTER(dbl, double, -1., 1., 0) - -#define BIQUAD_FILTER_REVERSE(name, type, min, max, need_clipping) \ -static void biquad_reverse_## name (BiquadsContext *s, \ const void *input, void *output, void *dst, \ int len, \ double *in1, double *in2, \ double *out1, double *out2, \ double b0, double b1, double b2, \ - double a1, double a2, int *clippings) \ + double a1, double a2, int *clippings, \ + int disabled) \ { \ const type *ibuf = input; \ type *obuf = output; \ @@ -305,11 +224,13 @@ static void biquad_reverse_## name (BiquadsContext *s, \ a2 = -a2; \ \ for (i = 0; i+1 < len; i++) { \ - j = len - 1 - i; \ + j = reverse ? len - 1 - i : i; \ o2 = i2 * b2 + i1 * b1 + ibuf[j] * b0 + o2 * a2 + o1 * a1; \ i2 = ibuf[j]; \ out = o2 * wet + i2 * dry; \ - if (need_clipping && out < min) { \ + if (disabled) { \ + obuf[j] = ibuf[j]; \ + } else if (need_clipping && out < min) { \ (*clippings)++; \ obuf[j] = min; \ } else if (need_clipping && out > max) { \ @@ -319,11 +240,13 @@ static void biquad_reverse_## name (BiquadsContext *s, \ obuf[j] = out; \ } \ i++; \ - j = len - 1 - i; \ + j = reverse ? len - 1 - i : i; \ o1 = i1 * b2 + i2 * b1 + ibuf[j] * b0 + o1 * a2 + o2 * a1; \ i1 = ibuf[j]; \ out = o1 * wet + i1 * dry; \ - if (need_clipping && out < min) { \ + if (disabled) { \ + obuf[j] = ibuf[j]; \ + } else if (need_clipping && out < min) { \ (*clippings)++; \ obuf[j] = min; \ } else if (need_clipping && out > max) { \ @@ -334,14 +257,16 @@ static void biquad_reverse_## name (BiquadsContext *s, \ } \ } \ if (i < len) { \ - j = len - 1 - i; \ + j = reverse ? len - 1 - i : i; \ o0 = ibuf[j] * b0 + i1 * b1 + i2 * b2 + o1 * a1 + o2 * a2; \ i2 = i1; \ i1 = ibuf[j]; \ o2 = o1; \ o1 = o0; \ out = o0 * wet + i1 * dry; \ - if (need_clipping && out < min) { \ + if (disabled) { \ + obuf[j] = ibuf[j]; \ + } else if (need_clipping && out < min) { \ (*clippings)++; \ obuf[j] = min; \ } else if (need_clipping && out > max) { \ @@ -356,6 +281,8 @@ static void biquad_reverse_## name (BiquadsContext *s, \ *out1 = o1; \ *out2 = o2; \ \ + if (!reverse) return; \ + \ for (i = 0; i < len; i++) \ dbuf[i] += obuf[i] * w[i]; \ for (i = 0; i < s->hop_size; i++) \ @@ -366,67 +293,25 @@ static void biquad_reverse_## name (BiquadsContext *s, \ s->hop_size * s->block_align); \ } -BIQUAD_FILTER_REVERSE(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_FILTER_REVERSE(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_FILTER_REVERSE(flt, float, -1., 1., 0) -BIQUAD_FILTER_REVERSE(dbl, double, -1., 1., 0) - -#define BIQUAD_DII_FILTER(name, type, min, max, need_clipping) \ -static void biquad_dii_## name (BiquadsContext *s, \ - const void *input, void *output, int len, \ - double *z1, double *z2, \ - double *unused1, double *unused2, \ - double b0, double b1, double b2, \ - double a1, double a2, int *clippings, \ - int disabled) \ -{ \ - const type *ibuf = input; \ - type *obuf = output; \ - double w1 = *z1; \ - double w2 = *z2; \ - double wet = s->mix; \ - double dry = 1. - wet; \ - double in, out, w0; \ - \ - a1 = -a1; \ - a2 = -a2; \ - \ - for (int i = 0; i < len; i++) { \ - in = ibuf[i]; \ - w0 = in + a1 * w1 + a2 * w2; \ - out = b0 * w0 + b1 * w1 + b2 * w2; \ - w2 = w1; \ - w1 = w0; \ - out = out * wet + in * dry; \ - if (disabled) { \ - obuf[i] = in; \ - } else if (need_clipping && out < min) { \ - (*clippings)++; \ - obuf[i] = min; \ - } else if (need_clipping && out > max) { \ - (*clippings)++; \ - obuf[i] = max; \ - } else { \ - obuf[i] = out; \ - } \ - } \ - *z1 = w1; \ - *z2 = w2; \ -} +BIQUAD_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1, 0) +BIQUAD_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1, 0) +BIQUAD_FILTER(flt, float, -1., 1., 0, 0) +BIQUAD_FILTER(dbl, double, -1., 1., 0, 0) -BIQUAD_DII_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_DII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_DII_FILTER(flt, float, -1., 1., 0) -BIQUAD_DII_FILTER(dbl, double, -1., 1., 0) +BIQUAD_FILTER(reverse_s16, int16_t, INT16_MIN, INT16_MAX, 1, 1) +BIQUAD_FILTER(reverse_s32, int32_t, INT32_MIN, INT32_MAX, 1, 1) +BIQUAD_FILTER(reverse_flt, float, -1., 1., 0, 1) +BIQUAD_FILTER(reverse_dbl, double, -1., 1., 0, 1) -#define BIQUAD_REVERSE_DII_FILTER(name, type, min, max, need_clipping) \ -static void biquad_reverse_dii_## name (BiquadsContext *s, \ +#define BIQUAD_DII_FILTER(name, type, min, max, need_clipping, reverse) \ +static void biquad_## name (BiquadsContext *s, \ const void *input, void *output, void *dst, \ int len, \ double *z1, double *z2, \ double *unused1, double *unused2, \ double b0, double b1, double b2, \ - double a1, double a2, int *clippings) \ + double a1, double a2, int *clippings, \ + int disabled) \ { \ const double *w = s->window_func_lut; \ const type *ibuf = input; \ @@ -442,14 +327,16 @@ static void biquad_reverse_dii_## name (BiquadsContext *s, \ a2 = -a2; \ \ for (int i = 0; i < len; i++) { \ - int j = len - 1 - i; \ + int j = reverse ? len - 1 - i : i; \ in = ibuf[j]; \ w0 = in + a1 * w1 + a2 * w2; \ out = b0 * w0 + b1 * w1 + b2 * w2; \ w2 = w1; \ w1 = w0; \ out = out * wet + in * dry; \ - if (need_clipping && out < min) { \ + if (disabled) { \ + obuf[j] = in; \ + } else if (need_clipping && out < min) { \ (*clippings)++; \ obuf[j] = min; \ } else if (need_clipping && out > max) { \ @@ -462,6 +349,8 @@ static void biquad_reverse_dii_## name (BiquadsContext *s, \ *z1 = w1; \ *z2 = w2; \ \ + if (!reverse) return; \ + \ for (int i = 0; i < len; i++) \ dbuf[i] += obuf[i] * w[i]; \ for (int i = 0; i < s->hop_size; i++) \ @@ -472,66 +361,25 @@ static void biquad_reverse_dii_## name (BiquadsContext *s, \ s->hop_size * s->block_align); \ } -BIQUAD_REVERSE_DII_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_REVERSE_DII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_REVERSE_DII_FILTER(flt, float, -1., 1., 0) -BIQUAD_REVERSE_DII_FILTER(dbl, double, -1., 1., 0) +BIQUAD_DII_FILTER(dii_s16, int16_t, INT16_MIN, INT16_MAX, 1, 0) +BIQUAD_DII_FILTER(dii_s32, int32_t, INT32_MIN, INT32_MAX, 1, 0) +BIQUAD_DII_FILTER(dii_flt, float, -1., 1., 0, 0) +BIQUAD_DII_FILTER(dii_dbl, double, -1., 1., 0, 0) -#define BIQUAD_TDII_FILTER(name, type, min, max, need_clipping) \ -static void biquad_tdii_## name (BiquadsContext *s, \ - const void *input, void *output, int len, \ - double *z1, double *z2, \ - double *unused1, double *unused2, \ - double b0, double b1, double b2, \ - double a1, double a2, int *clippings, \ - int disabled) \ -{ \ - const type *ibuf = input; \ - type *obuf = output; \ - double w1 = *z1; \ - double w2 = *z2; \ - double wet = s->mix; \ - double dry = 1. - wet; \ - double in, out; \ - \ - a1 = -a1; \ - a2 = -a2; \ - \ - for (int i = 0; i < len; i++) { \ - in = ibuf[i]; \ - out = b0 * in + w1; \ - w1 = b1 * in + w2 + a1 * out; \ - w2 = b2 * in + a2 * out; \ - out = out * wet + in * dry; \ - if (disabled) { \ - obuf[i] = in; \ - } else if (need_clipping && out < min) { \ - (*clippings)++; \ - obuf[i] = min; \ - } else if (need_clipping && out > max) { \ - (*clippings)++; \ - obuf[i] = max; \ - } else { \ - obuf[i] = out; \ - } \ - } \ - *z1 = w1; \ - *z2 = w2; \ -} - -BIQUAD_TDII_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_TDII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_TDII_FILTER(flt, float, -1., 1., 0) -BIQUAD_TDII_FILTER(dbl, double, -1., 1., 0) +BIQUAD_DII_FILTER(reverse_dii_s16, int16_t, INT16_MIN, INT16_MAX, 1, 1) +BIQUAD_DII_FILTER(reverse_dii_s32, int32_t, INT32_MIN, INT32_MAX, 1, 1) +BIQUAD_DII_FILTER(reverse_dii_flt, float, -1., 1., 0, 1) +BIQUAD_DII_FILTER(reverse_dii_dbl, double, -1., 1., 0, 1) -#define BIQUAD_REVERSE_TDII_FILTER(name, type, min, max, need_clipping) \ -static void biquad_reverse_tdii_## name (BiquadsContext *s, \ +#define BIQUAD_TDII_FILTER(name, type, min, max, need_clipping, reverse) \ +static void biquad_## name (BiquadsContext *s, \ const void *input, void *output, void *dst, \ int len, \ double *z1, double *z2, \ double *unused1, double *unused2, \ double b0, double b1, double b2, \ - double a1, double a2, int *clippings) \ + double a1, double a2, int *clippings, \ + int disabled) \ { \ const double *w = s->window_func_lut; \ const type *ibuf = input; \ @@ -547,13 +395,15 @@ static void biquad_reverse_tdii_## name (BiquadsContext *s, \ a2 = -a2; \ \ for (int i = 0; i < len; i++) { \ - int j = len - 1 - i; \ + int j = reverse ? len - 1 - i : i; \ in = ibuf[j]; \ out = b0 * in + w1; \ w1 = b1 * in + w2 + a1 * out; \ w2 = b2 * in + a2 * out; \ out = out * wet + in * dry; \ - if (need_clipping && out < min) { \ + if (disabled) { \ + obuf[j] = in; \ + } else if (need_clipping && out < min) { \ (*clippings)++; \ obuf[j] = min; \ } else if (need_clipping && out > max) { \ @@ -566,6 +416,8 @@ static void biquad_reverse_tdii_## name (BiquadsContext *s, \ *z1 = w1; \ *z2 = w2; \ \ + if (!reverse) return; \ + \ for (int i = 0; i < len; i++) \ dbuf[i] += obuf[i] * w[i]; \ for (int i = 0; i < s->hop_size; i++) \ @@ -576,10 +428,15 @@ static void biquad_reverse_tdii_## name (BiquadsContext *s, \ s->hop_size * s->block_align); \ } -BIQUAD_REVERSE_TDII_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1) -BIQUAD_REVERSE_TDII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) -BIQUAD_REVERSE_TDII_FILTER(flt, float, -1., 1., 0) -BIQUAD_REVERSE_TDII_FILTER(dbl, double, -1., 1., 0) +BIQUAD_TDII_FILTER(tdii_s16, int16_t, INT16_MIN, INT16_MAX, 1, 0) +BIQUAD_TDII_FILTER(tdii_s32, int32_t, INT32_MIN, INT32_MAX, 1, 0) +BIQUAD_TDII_FILTER(tdii_flt, float, -1., 1., 0, 0) +BIQUAD_TDII_FILTER(tdii_dbl, double, -1., 1., 0, 0) + +BIQUAD_TDII_FILTER(reverse_tdii_s16, int16_t, INT16_MIN, INT16_MAX, 1, 1) +BIQUAD_TDII_FILTER(reverse_tdii_s32, int32_t, INT32_MIN, INT32_MAX, 1, 1) +BIQUAD_TDII_FILTER(reverse_tdii_flt, float, -1., 1., 0, 1) +BIQUAD_TDII_FILTER(reverse_tdii_dbl, double, -1., 1., 0, 1) static int config_filter(AVFilterLink *outlink, int reset) { @@ -875,7 +732,7 @@ static int reverse_filter_channel(AVFilterContext *ctx, void *arg, int jobnr, in continue; } - s->filter(s, buf->extended_data[ch], tmp_buf->extended_data[ch], buf->nb_samples, + s->filter(s, buf->extended_data[ch], tmp_buf->extended_data[ch], NULL, buf->nb_samples, &s->cache[ch].i1, &s->cache[ch].i2, &s->cache[ch].o1, &s->cache[ch].o2, s->b0, s->b1, s->b2, s->a1, s->a2, &s->cache[ch].clippings, ctx->is_disabled); s->reverse_filter(s, tmp_buf->extended_data[ch], out_buf->extended_data[ch], @@ -883,7 +740,7 @@ static int reverse_filter_channel(AVFilterContext *ctx, void *arg, int jobnr, in tmp_buf->nb_samples, &s->cache[ch].ri1, &s->cache[ch].ri2, &s->cache[ch].ro1, &s->cache[ch].ro2, s->b0, s->b1, s->b2, s->a1, s->a2, - &s->cache[ch].clippings); + &s->cache[ch].clippings, ctx->is_disabled); } return 0; @@ -908,7 +765,7 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job continue; } - s->filter(s, buf->extended_data[ch], out_buf->extended_data[ch], buf->nb_samples, + s->filter(s, buf->extended_data[ch], out_buf->extended_data[ch], NULL, buf->nb_samples, &s->cache[ch].i1, &s->cache[ch].i2, &s->cache[ch].o1, &s->cache[ch].o2, s->b0, s->b1, s->b2, s->a1, s->a2, &s->cache[ch].clippings, ctx->is_disabled); }