]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/af_afir: stop using as much threads as stream have it
authorPaul B Mahol <onemda@gmail.com>
Sun, 30 Dec 2018 16:40:31 +0000 (17:40 +0100)
committerPaul B Mahol <onemda@gmail.com>
Sun, 30 Dec 2018 16:50:44 +0000 (17:50 +0100)
libavfilter/af_afir.c

index 3e13edf96ad475d242af7f8a5ab3567a1b1ec604..35fa66bad5ad693c71b3ca9e29a4cb5d2c97b880 100644 (file)
@@ -56,7 +56,7 @@ static void fcmul_add_c(float *sum, const float *t, const float *c, ptrdiff_t le
     sum[2 * n] += t[2 * n] * c[2 * n];
 }
 
-static int fir_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
+static int fir_channel(AVFilterContext *ctx, void *arg, int ch)
 {
     AudioFIRContext *s = ctx->priv;
     const float *in = (const float *)s->in[0]->extended_data[ch];
@@ -138,6 +138,19 @@ static int fir_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
     return 0;
 }
 
+static int fir_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AVFrame *out = arg;
+    const int start = (out->channels * jobnr) / nb_jobs;
+    const int end = (out->channels * (jobnr+1)) / nb_jobs;
+
+    for (int ch = start; ch < end; ch++) {
+        fir_channel(ctx, out, ch);
+    }
+
+    return 0;
+}
+
 static int fir_frame(AudioFIRContext *s, AVFrame *in, AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -152,7 +165,8 @@ static int fir_frame(AudioFIRContext *s, AVFrame *in, AVFilterLink *outlink)
     if (s->pts == AV_NOPTS_VALUE)
         s->pts = in->pts;
     s->in[0] = in;
-    ctx->internal->execute(ctx, fir_channel, out, NULL, outlink->channels);
+    ctx->internal->execute(ctx, fir_channels, out, NULL, FFMIN(outlink->channels,
+                                                               ff_filter_get_nb_threads(ctx)));
 
     out->pts = s->pts;
     if (s->pts != AV_NOPTS_VALUE)