+
+ return 0;
+}
+
+static int ifilter_flt(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ ThreadData *td = arg;
+ void **d = td->d;
+ void **p = td->p;
+ const void **s = td->s;
+ const int nb_samples = td->nb_samples;
+ const int channels = td->channels;
+ const float mult = -td->mult;
+ const float div = -td->mult + 1.f;
+ const int clip = td->clip;
+ const int start = (channels * jobnr) / nb_jobs;
+ const int end = (channels * (jobnr+1)) / nb_jobs;
+ float *prv = p[0];
+ int n, c;
+
+ for (c = start; c < end; c++) {
+ const float *src = s[0];
+ float *dst = d[0];
+
+ for (n = 0; n < nb_samples; n++) {
+ float current = src[c];
+ dst[c] = (current + prv[c] * mult) / div;
+ prv[c] = dst[c];
+ if (clip) {
+ dst[c] = av_clipf(dst[c], -1, 1);
+ }
+
+ dst += channels;
+ src += channels;
+ }
+ }
+
+ return 0;
+}
+
+static int ifilter_dbl(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ ThreadData *td = arg;
+ void **d = td->d;
+ void **p = td->p;
+ const void **s = td->s;
+ const int nb_samples = td->nb_samples;
+ const int channels = td->channels;
+ const double mult = -td->mult;
+ const double div = -td->mult + 1.f;
+ const int clip = td->clip;
+ const int start = (channels * jobnr) / nb_jobs;
+ const int end = (channels * (jobnr+1)) / nb_jobs;
+ double *prv = p[0];
+ int n, c;
+
+ for (c = start; c < end; c++) {
+ const double *src = s[0];
+ double *dst = d[0];
+
+ for (n = 0; n < nb_samples; n++) {
+ double current = src[c];
+
+ dst[c] = (current + prv[c] * mult) / div;
+ prv[c] = dst[c];
+ if (clip) {
+ dst[c] = av_clipd(dst[c], -1, 1);
+ }
+
+ dst += channels;
+ src += channels;
+ }
+ }
+
+ return 0;
+}
+
+static int ifilter_fltp(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ ThreadData *td = arg;
+ void **d = td->d;
+ void **p = td->p;
+ const void **s = td->s;
+ const int nb_samples = td->nb_samples;
+ const int channels = td->channels;
+ const float mult = -td->mult;
+ const float div = -td->mult + 1.f;
+ const int clip = td->clip;
+ const int start = (channels * jobnr) / nb_jobs;
+ const int end = (channels * (jobnr+1)) / nb_jobs;
+ int n, c;
+
+ for (c = start; c < end; c++) {
+ const float *src = s[c];
+ float *dst = d[c];
+ float *prv = p[c];
+
+ for (n = 0; n < nb_samples; n++) {
+ float current = src[n];
+
+ dst[n] = (current + prv[0] * mult) / div;
+ prv[0] = dst[n];
+ if (clip) {
+ dst[n] = av_clipf(dst[n], -1, 1);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int ifilter_dblp(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ ThreadData *td = arg;
+ void **d = td->d;
+ void **p = td->p;
+ const void **s = td->s;
+ const int nb_samples = td->nb_samples;
+ const int channels = td->channels;
+ const double mult = -td->mult;
+ const double div = -td->mult + 1.f;
+ const int clip = td->clip;
+ const int start = (channels * jobnr) / nb_jobs;
+ const int end = (channels * (jobnr+1)) / nb_jobs;
+ int n, c;
+
+ for (c = start; c < end; c++) {
+ const double *src = s[c];
+ double *dst = d[c];
+ double *prv = p[c];
+
+ for (n = 0; n < nb_samples; n++) {
+ double current = src[n];
+
+ dst[n] = (current + prv[0] * mult) / div;
+ prv[0] = dst[n];
+ if (clip) {
+ dst[n] = av_clipd(dst[n], -1, 1);
+ }
+ }
+ }
+
+ return 0;