+ w[0] = w1;
+ w[1] = w2;
+}
+
+typedef struct ThreadData {
+ AVFrame *in, *out;
+} ThreadData;
+
+static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ AudioEmphasisContext *s = ctx->priv;
+ const double level_out = s->level_out;
+ const double level_in = s->level_in;
+ ThreadData *td = arg;
+ AVFrame *out = td->out;
+ AVFrame *in = td->in;
+ const int start = (in->channels * jobnr) / nb_jobs;
+ const int end = (in->channels * (jobnr+1)) / nb_jobs;
+
+ for (int ch = start; ch < end; ch++) {
+ const double *src = (const double *)in->extended_data[ch];
+ double *w = (double *)s->w->extended_data[ch];
+ double *dst = (double *)out->extended_data[ch];
+
+ if (s->rc.use_brickw) {
+ biquad_process(&s->rc.brickw, dst, src, in->nb_samples, w + 2, level_in, 1.);
+ biquad_process(&s->rc.r1, dst, dst, in->nb_samples, w, 1., level_out);
+ } else {
+ biquad_process(&s->rc.r1, dst, src, in->nb_samples, w, level_in, level_out);
+ }
+ }