History

avfilter/af_surround: speed up slice threading for stereo upmixing

And add stereo->octagonal/8.0 upmix.

Paul B Mahol committed 4 years ago

Commit e0fbf891 parent 104b5161 file · +831 −472Browse files

Unified · Split

libavfilter/af_surround.c+831−472
@@ -85,6 +85,7 @@ typedef struct AudioSurroundContext { · 84 unmodified lines
8585 float *input_levels;
8686 float *output_levels;
8787 int output_lfe;
88+ int have_lfe;
8889 int lowcutf;
8990 int highcutf;
9091
@@ -103,20 +104,23 @@ typedef struct AudioSurroundContext { · 12 unmodified lines
103104 AVFrame *overlap_buffer;
104105 AVFrame *window;
105106
107+ float *x_pos;
108+ float *y_pos;
109+ float *l_phase;
110+ float *r_phase;
111+ float *c_phase;
112+ float *lfe_mag;
113+ float *mag_total;
114+
106115 int buf_size;
116+ int rdft_size;
107117 int hop_size;
108118 AVTXContext **rdft, **irdft;
109119 av_tx_fn tx_fn, itx_fn;
110120 float *window_func_lut;
111121
112122 void (*filter)(AVFilterContext *ctx);
113− void (*upmix_stereo)(AVFilterContext *ctx,
114− float l_phase,
115− float r_phase,
116− float c_phase,
117− float mag_total,
118− float x, float y,
119− int n);
123+ int (*upmix)(AVFilterContext *ctx, void *arg, int ch, int nb_jobs);
120124 void (*upmix_2_1)(AVFilterContext *ctx,
121125 float l_phase,
122126 float r_phase,
@@ -279,6 +283,7 @@ static int config_output(AVFilterLink *outlink) · 156 unmodified lines
279283 if (ret < 0)
280284 return ret;
281285 }
286+
282287 s->output_levels = av_malloc_array(s->nb_out_channels, sizeof(*s->output_levels));
283288 if (!s->output_levels)
284289 return AVERROR(ENOMEM);
@@ -318,6 +323,19 @@ static int config_output(AVFilterLink *outlink) · 33 unmodified lines
318323 if (!s->overlap_buffer || !s->output || !s->output_out)
319324 return AVERROR(ENOMEM);
320325
326+ s->rdft_size = s->buf_size / 2 + 1;
327+
328+ s->x_pos = av_calloc(s->rdft_size, sizeof(*s->x_pos));
329+ s->y_pos = av_calloc(s->rdft_size, sizeof(*s->y_pos));
330+ s->l_phase = av_calloc(s->rdft_size, sizeof(*s->l_phase));
331+ s->r_phase = av_calloc(s->rdft_size, sizeof(*s->r_phase));
332+ s->c_phase = av_calloc(s->rdft_size, sizeof(*s->c_phase));
333+ s->mag_total = av_calloc(s->rdft_size, sizeof(*s->mag_total));
334+ s->lfe_mag = av_calloc(s->rdft_size, sizeof(*s->lfe_mag));
335+ if (!s->x_pos || !s->y_pos || !s->l_phase || !s->r_phase ||
336+ !s->c_phase || !s->lfe_mag)
337+ return AVERROR(ENOMEM);
338+
321339 return 0;
322340 }
323341
@@ -362,141 +380,132 @@ static inline void get_lfe(int output_lfe, int n, float lowcut, float highcut, · 38 unmodified lines
362380 }
363381 }
364382
365−static void upmix_1_0(AVFilterContext *ctx,
366− float l_phase,
367− float r_phase,
368− float c_phase,
369− float mag_total,
370− float x, float y,
371− int n)
383+#define TRANSFORM \
384+ dst[2 * n ] = mag * cosf(ph); \
385+ dst[2 * n + 1] = mag * sinf(ph);
386+
387+static int upmix_1_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
372388 {
373389 AudioSurroundContext *s = ctx->priv;
374− float mag, *dst;
375−
376− dst = (float *)s->output->extended_data[0];
377−
378− mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
390+ float *dst = (float *)s->output->extended_data[0];
391+ const float *mag_total = s->mag_total;
392+ const int rdft_size = s->rdft_size;
393+ const float *phase = s->c_phase;
394+ const float *x = s->x_pos;
395+ const float *y = s->y_pos;
396+ const float fc_x = s->fc_x;
397+ const float fc_y = s->fc_y;
398+
399+ for (int n = 0; n < rdft_size; n++) {
400+ float mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
401+ float ph = phase[n];
402+
403+ TRANSFORM
404+ }
379405
380− dst[2 * n ] = mag * cosf(c_phase);
381− dst[2 * n + 1] = mag * sinf(c_phase);
406+ return 0;
382407 }
383408
384−static void upmix_stereo(AVFilterContext *ctx,
385− float l_phase,
386− float r_phase,
387− float c_phase,
388− float mag_total,
389− float x, float y,
390− int n)
409+static int upmix_stereo(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
391410 {
392411 AudioSurroundContext *s = ctx->priv;
393− float l_mag, r_mag, *dstl, *dstr;
394−
395− dstl = (float *)s->output->extended_data[0];
396− dstr = (float *)s->output->extended_data[1];
397−
398− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
399− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
400−
401− dstl[2 * n ] = l_mag * cosf(l_phase);
402− dstl[2 * n + 1] = l_mag * sinf(l_phase);
412+ float *dst = (float *)s->output->extended_data[ch];
413+ const float *phase = ch ? s->r_phase : s->l_phase;
414+ const float f_x = ch ? s->fr_x : s->fl_x;
415+ const float f_y = ch ? s->fr_y : s->fl_y;
416+ const float *mag_total = s->mag_total;
417+ const int rdft_size = s->rdft_size;
418+ const float neg = ch ? -1.f : 1.f;
419+ const float *x = s->x_pos;
420+ const float *y = s->y_pos;
421+
422+ for (int n = 0; n < rdft_size; n++) {
423+ float mag = powf(.5f * (neg * x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
424+ float ph = phase[n];
425+
426+ TRANSFORM
427+ }
403428
404− dstr[2 * n ] = r_mag * cosf(r_phase);
405− dstr[2 * n + 1] = r_mag * sinf(r_phase);
429+ return 0;
406430 }
407431
408−static void upmix_2_1(AVFilterContext *ctx,
409− float l_phase,
410− float r_phase,
411− float c_phase,
412− float mag_total,
413− float x, float y,
414− int n)
432+static int upmix_2_1(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
415433 {
416434 AudioSurroundContext *s = ctx->priv;
417− float lfe_mag, l_mag, r_mag, *dstl, *dstr, *dstlfe;
418−
419− dstl = (float *)s->output->extended_data[0];
420− dstr = (float *)s->output->extended_data[1];
421− dstlfe = (float *)s->output->extended_data[2];
422−
423− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
424−
425− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
426− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
427−
428− dstl[2 * n ] = l_mag * cosf(l_phase);
429− dstl[2 * n + 1] = l_mag * sinf(l_phase);
430−
431− dstr[2 * n ] = r_mag * cosf(r_phase);
432− dstr[2 * n + 1] = r_mag * sinf(r_phase);
435+ float *dst = (float *)s->output->extended_data[ch];
436+ const float *mag_total = s->mag_total;
437+ const int rdft_size = s->rdft_size;
438+ const float *phase = ch == 2 ? s->c_phase : ch == 1 ? s->r_phase : s->l_phase;
439+ const float *lfe_mag = s->lfe_mag;
440+ const float f_x = ch ? s->fr_x : s->fl_x;
441+ const float f_y = ch ? s->fr_y : s->fl_y;
442+ const float neg = ch ? -1.f : 1.f;
443+ const float *x = s->x_pos;
444+ const float *y = s->y_pos;
445+
446+ for (int n = 0; n < rdft_size; n++) {
447+ float mag = ch == 2 ? lfe_mag[n] : powf(.5f * (neg * x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
448+ float ph = phase[n];
449+
450+ TRANSFORM
451+ }
433452
434− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
435− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
453+ return 0;
436454 }
437455
438−static void upmix_3_0(AVFilterContext *ctx,
439− float l_phase,
440− float r_phase,
441− float c_phase,
442− float mag_total,
443− float x, float y,
444− int n)
456+static int upmix_3_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
445457 {
446458 AudioSurroundContext *s = ctx->priv;
447− float l_mag, r_mag, c_mag, *dstc, *dstl, *dstr;
448−
449− dstl = (float *)s->output->extended_data[0];
450− dstr = (float *)s->output->extended_data[1];
451− dstc = (float *)s->output->extended_data[2];
452−
453− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
454− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
455− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
456−
457− dstl[2 * n ] = l_mag * cosf(l_phase);
458− dstl[2 * n + 1] = l_mag * sinf(l_phase);
459−
460− dstr[2 * n ] = r_mag * cosf(r_phase);
461− dstr[2 * n + 1] = r_mag * sinf(r_phase);
459+ float *dst = (float *)s->output->extended_data[ch];
460+ const float *phase = ch == 2 ? s->c_phase : ch == 1 ? s->r_phase : s->l_phase;
461+ const float f_x = ch ? s->fr_x : s->fl_x;
462+ const float f_y = ch ? s->fr_y : s->fl_y;
463+ const float *mag_total = s->mag_total;
464+ const int rdft_size = s->rdft_size;
465+ const float neg = ch ? -1.f : 1.f;
466+ const float fc_x = s->fc_x;
467+ const float fc_y = s->fc_y;
468+ const float *x = s->x_pos;
469+ const float *y = s->y_pos;
470+
471+ for (int n = 0; n < rdft_size; n++) {
472+ float mag = ch == 2 ?
473+ powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n] :
474+ powf(.5f * (neg * x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
475+ float ph = phase[n];
476+
477+ TRANSFORM
478+ }
462479
463− dstc[2 * n ] = c_mag * cosf(c_phase);
464− dstc[2 * n + 1] = c_mag * sinf(c_phase);
480+ return 0;
465481 }
466482
467−static void upmix_3_1(AVFilterContext *ctx,
468− float l_phase,
469− float r_phase,
470− float c_phase,
471− float mag_total,
472− float x, float y,
473− int n)
483+static int upmix_3_1(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
474484 {
475485 AudioSurroundContext *s = ctx->priv;
476− float lfe_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstlfe;
477−
478− dstl = (float *)s->output->extended_data[0];
479− dstr = (float *)s->output->extended_data[1];
480− dstc = (float *)s->output->extended_data[2];
481− dstlfe = (float *)s->output->extended_data[3];
482−
483− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
484−
485− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
486− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
487− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
488−
489− dstl[2 * n ] = l_mag * cosf(l_phase);
490− dstl[2 * n + 1] = l_mag * sinf(l_phase);
491−
492− dstr[2 * n ] = r_mag * cosf(r_phase);
493− dstr[2 * n + 1] = r_mag * sinf(r_phase);
494−
495− dstc[2 * n ] = c_mag * cosf(c_phase);
496− dstc[2 * n + 1] = c_mag * sinf(c_phase);
486+ float *dst = (float *)s->output->extended_data[ch];
487+ const float *phase = ch >= 2 ? s->c_phase : ch == 1 ? s->r_phase : s->l_phase;
488+ const float f_x = ch ? s->fr_x : s->fl_x;
489+ const float f_y = ch ? s->fr_y : s->fl_y;
490+ const float *mag_total = s->mag_total;
491+ const int rdft_size = s->rdft_size;
492+ const float neg = ch ? -1.f : 1.f;
493+ const float *lfe_mag = s->lfe_mag;
494+ const float fc_x = s->fc_x;
495+ const float fc_y = s->fc_y;
496+ const float *x = s->x_pos;
497+ const float *y = s->y_pos;
498+
499+ for (int n = 0; n < rdft_size; n++) {
500+ float mag = ch == 3 ? lfe_mag[n] : ch == 2 ?
501+ powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n] :
502+ powf(.5f * (neg * x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
503+ float ph = phase[n];
504+
505+ TRANSFORM
506+ }
497507
498− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
499− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
508+ return 0;
500509 }
501510
502511 static void upmix_3_1_surround(AVFilterContext *ctx,
@@ -534,256 +543,385 @@ static void upmix_3_1_surround(AVFilterContext *ctx, · 31 unmodified lines
534543 dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
535544 }
536545
537−static void upmix_4_0(AVFilterContext *ctx,
538− float l_phase,
539− float r_phase,
540− float c_phase,
541− float mag_total,
542− float x, float y,
543− int n)
546+static int upmix_4_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
544547 {
545548 AudioSurroundContext *s = ctx->priv;
546− float b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb;
547−
548− dstl = (float *)s->output->extended_data[0];
549− dstr = (float *)s->output->extended_data[1];
550− dstc = (float *)s->output->extended_data[2];
551− dstb = (float *)s->output->extended_data[3];
552−
553− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
554− b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
555− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
556− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
557−
558− dstl[2 * n ] = l_mag * cosf(l_phase);
559− dstl[2 * n + 1] = l_mag * sinf(l_phase);
560−
561− dstr[2 * n ] = r_mag * cosf(r_phase);
562− dstr[2 * n + 1] = r_mag * sinf(r_phase);
549+ float *dst = (float *)s->output->extended_data[ch];
550+ const float *mag_total = s->mag_total;
551+ const int rdft_size = s->rdft_size;
552+ const float *l_phase = s->l_phase;
553+ const float *r_phase = s->r_phase;
554+ const float *c_phase = s->c_phase;
555+ const float fl_x = s->fl_x;
556+ const float fl_y = s->fl_y;
557+ const float fr_x = s->fr_x;
558+ const float fr_y = s->fr_y;
559+ const float fc_x = s->fc_x;
560+ const float fc_y = s->fc_y;
561+ const float bc_x = s->bc_x;
562+ const float bc_y = s->bc_y;
563+ const float *x = s->x_pos;
564+ const float *y = s->y_pos;
565+
566+ for (int n = 0; n < rdft_size; n++) {
567+ float mag, ph;
568+
569+ switch (ch) {
570+ case 0:
571+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
572+ ph = l_phase[n];
573+ break;
574+ case 1:
575+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
576+ ph = r_phase[n];
577+ break;
578+ case 2:
579+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
580+ ph = c_phase[n];
581+ break;
582+ case 3:
583+ mag = powf(1.f - fabsf(x[n]), bc_x) * powf((1.f - y[n]) * .5f, bc_y) * mag_total[n];
584+ ph = c_phase[n];
585+ break;
586+ }
563587
564− dstc[2 * n ] = c_mag * cosf(c_phase);
565− dstc[2 * n + 1] = c_mag * sinf(c_phase);
588+ TRANSFORM
589+ }
566590
567− dstb[2 * n ] = b_mag * cosf(c_phase);
568− dstb[2 * n + 1] = b_mag * sinf(c_phase);
591+ return 0;
569592 }
570593
571−static void upmix_4_1(AVFilterContext *ctx,
572− float l_phase,
573− float r_phase,
574− float c_phase,
575− float mag_total,
576− float x, float y,
577− int n)
594+static int upmix_4_1(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
578595 {
579596 AudioSurroundContext *s = ctx->priv;
580− float lfe_mag, b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb, *dstlfe;
581−
582− dstl = (float *)s->output->extended_data[0];
583− dstr = (float *)s->output->extended_data[1];
584− dstc = (float *)s->output->extended_data[2];
585− dstlfe = (float *)s->output->extended_data[3];
586− dstb = (float *)s->output->extended_data[4];
587−
588− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
589−
590− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
591− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
592−
593− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
594− b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
595− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
596− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
597−
598− dstl[2 * n ] = l_mag * cosf(l_phase);
599− dstl[2 * n + 1] = l_mag * sinf(l_phase);
600−
601− dstr[2 * n ] = r_mag * cosf(r_phase);
602− dstr[2 * n + 1] = r_mag * sinf(r_phase);
597+ float *dst = (float *)s->output->extended_data[ch];
598+ const float *mag_total = s->mag_total;
599+ const int rdft_size = s->rdft_size;
600+ const float *lfe_mag = s->lfe_mag;
601+ const float *l_phase = s->l_phase;
602+ const float *r_phase = s->r_phase;
603+ const float *c_phase = s->c_phase;
604+ const float fl_x = s->fl_x;
605+ const float fl_y = s->fl_y;
606+ const float fr_x = s->fr_x;
607+ const float fr_y = s->fr_y;
608+ const float fc_x = s->fc_x;
609+ const float fc_y = s->fc_y;
610+ const float bc_x = s->bc_x;
611+ const float bc_y = s->bc_y;
612+ const float *x = s->x_pos;
613+ const float *y = s->y_pos;
614+
615+ for (int n = 0; n < rdft_size; n++) {
616+ float mag, ph;
617+
618+ switch (ch) {
619+ case 0:
620+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
621+ ph = l_phase[n];
622+ break;
623+ case 1:
624+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
625+ ph = r_phase[n];
626+ break;
627+ case 2:
628+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
629+ ph = c_phase[n];
630+ break;
631+ case 3:
632+ mag = lfe_mag[n];
633+ ph = c_phase[n];
634+ break;
635+ case 4:
636+ mag = powf(1.f - fabsf(x[n]), bc_x) * powf((1.f - y[n]) * .5f, bc_y) * mag_total[n];
637+ ph = c_phase[n];
638+ break;
639+ }
603640
604− dstc[2 * n ] = c_mag * cosf(c_phase);
605− dstc[2 * n + 1] = c_mag * sinf(c_phase);
641+ TRANSFORM
642+ }
606643
607− dstb[2 * n ] = b_mag * cosf(c_phase);
608− dstb[2 * n + 1] = b_mag * sinf(c_phase);
644+ return 0;
609645 }
610646
611−static void upmix_5_0_back(AVFilterContext *ctx,
612− float l_phase,
613− float r_phase,
614− float c_phase,
615− float mag_total,
616− float x, float y,
617− int n)
647+static int upmix_5_0_back(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
618648 {
619649 AudioSurroundContext *s = ctx->priv;
620− float l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs;
621−
622− dstl = (float *)s->output->extended_data[0];
623− dstr = (float *)s->output->extended_data[1];
624− dstc = (float *)s->output->extended_data[2];
625− dstls = (float *)s->output->extended_data[3];
626− dstrs = (float *)s->output->extended_data[4];
627−
628− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
629− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
630− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
631− ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
632− rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
633−
634− dstl[2 * n ] = l_mag * cosf(l_phase);
635− dstl[2 * n + 1] = l_mag * sinf(l_phase);
636−
637− dstr[2 * n ] = r_mag * cosf(r_phase);
638− dstr[2 * n + 1] = r_mag * sinf(r_phase);
639−
640− dstc[2 * n ] = c_mag * cosf(c_phase);
641− dstc[2 * n + 1] = c_mag * sinf(c_phase);
650+ float *dst = (float *)s->output->extended_data[ch];
651+ const float *mag_total = s->mag_total;
652+ const int rdft_size = s->rdft_size;
653+ const float *l_phase = s->l_phase;
654+ const float *r_phase = s->r_phase;
655+ const float *c_phase = s->c_phase;
656+ const float fl_x = s->fl_x;
657+ const float fl_y = s->fl_y;
658+ const float fr_x = s->fr_x;
659+ const float fr_y = s->fr_y;
660+ const float bl_x = s->bl_x;
661+ const float bl_y = s->bl_y;
662+ const float br_x = s->br_x;
663+ const float br_y = s->br_y;
664+ const float fc_x = s->fc_x;
665+ const float fc_y = s->fc_y;
666+ const float *x = s->x_pos;
667+ const float *y = s->y_pos;
668+
669+ for (int n = 0; n < rdft_size; n++) {
670+ float mag, ph;
671+
672+ switch (ch) {
673+ case 2:
674+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
675+ ph = c_phase[n];
676+ break;
677+ case 0:
678+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
679+ ph = l_phase[n];
680+ break;
681+ case 1:
682+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
683+ ph = r_phase[n];
684+ break;
685+ case 3:
686+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
687+ ph = l_phase[n];
688+ break;
689+ case 4:
690+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
691+ ph = r_phase[n];
692+ break;
693+ }
642694
643− dstls[2 * n ] = ls_mag * cosf(l_phase);
644− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
695+ TRANSFORM
696+ }
645697
646− dstrs[2 * n ] = rs_mag * cosf(r_phase);
647− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
698+ return 0;
648699 }
649700
650−static void upmix_5_1_back(AVFilterContext *ctx,
651− float l_phase,
652− float r_phase,
653− float c_phase,
654− float mag_total,
655− float x, float y,
656− int n)
701+static int upmix_5_1_back(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
657702 {
658703 AudioSurroundContext *s = ctx->priv;
659− float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
660−
661− dstl = (float *)s->output->extended_data[0];
662− dstr = (float *)s->output->extended_data[1];
663− dstc = (float *)s->output->extended_data[2];
664− dstlfe = (float *)s->output->extended_data[3];
665− dstls = (float *)s->output->extended_data[4];
666− dstrs = (float *)s->output->extended_data[5];
667−
668− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
669−
670− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
671− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
672− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
673− ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
674− rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
675−
676− dstl[2 * n ] = l_mag * cosf(l_phase);
677− dstl[2 * n + 1] = l_mag * sinf(l_phase);
678−
679− dstr[2 * n ] = r_mag * cosf(r_phase);
680− dstr[2 * n + 1] = r_mag * sinf(r_phase);
681−
682− dstc[2 * n ] = c_mag * cosf(c_phase);
683− dstc[2 * n + 1] = c_mag * sinf(c_phase);
684−
685− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
686− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
687−
688− dstls[2 * n ] = ls_mag * cosf(l_phase);
689− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
704+ float *dst = (float *)s->output->extended_data[ch];
705+ const float *mag_total = s->mag_total;
706+ const float *lfe_mag = s->lfe_mag;
707+ const int rdft_size = s->rdft_size;
708+ const float *l_phase = s->l_phase;
709+ const float *r_phase = s->r_phase;
710+ const float *c_phase = s->c_phase;
711+ const float fl_x = s->fl_x;
712+ const float fl_y = s->fl_y;
713+ const float fr_x = s->fr_x;
714+ const float fr_y = s->fr_y;
715+ const float bl_x = s->bl_x;
716+ const float bl_y = s->bl_y;
717+ const float br_x = s->br_x;
718+ const float br_y = s->br_y;
719+ const float fc_x = s->fc_x;
720+ const float fc_y = s->fc_y;
721+ const float *x = s->x_pos;
722+ const float *y = s->y_pos;
723+ float mag, ph;
724+
725+ switch (ch) {
726+ case 0:
727+ for (int n = 0; n < rdft_size; n++) {
728+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
729+ ph = l_phase[n];
730+ TRANSFORM
731+ }
732+ break;
733+ case 1:
734+ for (int n = 0; n < rdft_size; n++) {
735+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
736+ ph = r_phase[n];
737+ TRANSFORM
738+ }
739+ break;
740+ case 2:
741+ for (int n = 0; n < rdft_size; n++) {
742+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
743+ ph = c_phase[n];
744+ TRANSFORM
745+ }
746+ break;
747+ case 3:
748+ for (int n = 0; n < rdft_size; n++) {
749+ mag = lfe_mag[n];
750+ ph = c_phase[n];
751+ TRANSFORM
752+ }
753+ break;
754+ case 4:
755+ for (int n = 0; n < rdft_size; n++) {
756+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
757+ ph = l_phase[n];
758+ TRANSFORM
759+ }
760+ break;
761+ case 5:
762+ for (int n = 0; n < rdft_size; n++) {
763+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
764+ ph = r_phase[n];
765+ TRANSFORM
766+ }
767+ break;
768+ }
690769
691− dstrs[2 * n ] = rs_mag * cosf(r_phase);
692− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
770+ return 0;
693771 }
694772
695−static void upmix_6_0(AVFilterContext *ctx,
696− float l_phase,
697− float r_phase,
698− float c_phase,
699− float mag_total,
700− float x, float y,
701− int n)
773+static int upmix_6_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
702774 {
703775 AudioSurroundContext *s = ctx->priv;
704− float l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs;
705−
706− dstl = (float *)s->output->extended_data[0];
707− dstr = (float *)s->output->extended_data[1];
708− dstc = (float *)s->output->extended_data[2];
709− dstb = (float *)s->output->extended_data[3];
710− dstls = (float *)s->output->extended_data[4];
711− dstrs = (float *)s->output->extended_data[5];
712−
713− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
714− b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
715− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
716− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
717− ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
718− rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
719−
720− dstl[2 * n ] = l_mag * cosf(l_phase);
721− dstl[2 * n + 1] = l_mag * sinf(l_phase);
722−
723− dstr[2 * n ] = r_mag * cosf(r_phase);
724− dstr[2 * n + 1] = r_mag * sinf(r_phase);
725−
726− dstc[2 * n ] = c_mag * cosf(c_phase);
727− dstc[2 * n + 1] = c_mag * sinf(c_phase);
728−
729− dstls[2 * n ] = ls_mag * cosf(l_phase);
730− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
731−
732− dstrs[2 * n ] = rs_mag * cosf(r_phase);
733− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
776+ float *dst = (float *)s->output->extended_data[ch];
777+ const float *mag_total = s->mag_total;
778+ const int rdft_size = s->rdft_size;
779+ const float *l_phase = s->l_phase;
780+ const float *r_phase = s->r_phase;
781+ const float *c_phase = s->c_phase;
782+ const float fl_x = s->fl_x;
783+ const float fl_y = s->fl_y;
784+ const float fr_x = s->fr_x;
785+ const float fr_y = s->fr_y;
786+ const float bl_x = s->bl_x;
787+ const float bl_y = s->bl_y;
788+ const float br_x = s->br_x;
789+ const float br_y = s->br_y;
790+ const float bc_x = s->bc_x;
791+ const float bc_y = s->bc_y;
792+ const float fc_x = s->fc_x;
793+ const float fc_y = s->fc_y;
794+ const float *x = s->x_pos;
795+ const float *y = s->y_pos;
796+ float mag, ph;
797+
798+ switch (ch) {
799+ case 0:
800+ for (int n = 0; n < rdft_size; n++) {
801+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
802+ ph = l_phase[n];
803+ TRANSFORM
804+ }
805+ break;
806+ case 1:
807+ for (int n = 0; n < rdft_size; n++) {
808+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
809+ ph = r_phase[n];
810+ TRANSFORM
811+ }
812+ break;
813+ case 2:
814+ for (int n = 0; n < rdft_size; n++) {
815+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
816+ ph = c_phase[n];
817+ TRANSFORM
818+ }
819+ break;
820+ case 3:
821+ for (int n = 0; n < rdft_size; n++) {
822+ mag = powf(1.f - fabsf(x[n]), bc_x) * powf((1.f - y[n]) * .5f, bc_y) * mag_total[n];
823+ ph = c_phase[n];
824+ TRANSFORM
825+ }
826+ break;
827+ case 4:
828+ for (int n = 0; n < rdft_size; n++) {
829+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
830+ ph = l_phase[n];
831+ TRANSFORM
832+ }
833+ break;
834+ case 5:
835+ for (int n = 0; n < rdft_size; n++) {
836+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
837+ ph = r_phase[n];
838+ TRANSFORM
839+ }
840+ break;
841+ }
734842
735− dstb[2 * n ] = b_mag * cosf(c_phase);
736− dstb[2 * n + 1] = b_mag * sinf(c_phase);
843+ return 0;
737844 }
738845
739−static void upmix_6_1(AVFilterContext *ctx,
740− float l_phase,
741− float r_phase,
742− float c_phase,
743− float mag_total,
744− float x, float y,
745− int n)
846+static int upmix_6_1(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
746847 {
747848 AudioSurroundContext *s = ctx->priv;
748− float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
749−
750− dstl = (float *)s->output->extended_data[0];
751− dstr = (float *)s->output->extended_data[1];
752− dstc = (float *)s->output->extended_data[2];
753− dstlfe = (float *)s->output->extended_data[3];
754− dstb = (float *)s->output->extended_data[4];
755− dstls = (float *)s->output->extended_data[5];
756− dstrs = (float *)s->output->extended_data[6];
757−
758− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
759−
760− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
761− b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
762− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
763− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
764− ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
765− rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
766−
767− dstl[2 * n ] = l_mag * cosf(l_phase);
768− dstl[2 * n + 1] = l_mag * sinf(l_phase);
769−
770− dstr[2 * n ] = r_mag * cosf(r_phase);
771− dstr[2 * n + 1] = r_mag * sinf(r_phase);
772−
773− dstc[2 * n ] = c_mag * cosf(c_phase);
774− dstc[2 * n + 1] = c_mag * sinf(c_phase);
775−
776− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
777− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
778−
779− dstls[2 * n ] = ls_mag * cosf(l_phase);
780− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
781−
782− dstrs[2 * n ] = rs_mag * cosf(r_phase);
783− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
849+ float *dst = (float *)s->output->extended_data[ch];
850+ const float *mag_total = s->mag_total;
851+ const int rdft_size = s->rdft_size;
852+ const float *lfe_mag = s->lfe_mag;
853+ const float *l_phase = s->l_phase;
854+ const float *r_phase = s->r_phase;
855+ const float *c_phase = s->c_phase;
856+ const float fl_x = s->fl_x;
857+ const float fl_y = s->fl_y;
858+ const float fr_x = s->fr_x;
859+ const float fr_y = s->fr_y;
860+ const float bl_x = s->bl_x;
861+ const float bl_y = s->bl_y;
862+ const float br_x = s->br_x;
863+ const float br_y = s->br_y;
864+ const float bc_x = s->bc_x;
865+ const float bc_y = s->bc_y;
866+ const float fc_x = s->fc_x;
867+ const float fc_y = s->fc_y;
868+ const float *x = s->x_pos;
869+ const float *y = s->y_pos;
870+ float mag, ph;
871+
872+ switch (ch) {
873+ case 0:
874+ for (int n = 0; n < rdft_size; n++) {
875+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
876+ ph = l_phase[n];
877+ TRANSFORM
878+ }
879+ break;
880+ case 1:
881+ for (int n = 0; n < rdft_size; n++) {
882+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
883+ ph = r_phase[n];
884+ TRANSFORM
885+ }
886+ break;
887+ case 2:
888+ for (int n = 0; n < rdft_size; n++) {
889+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
890+ ph = c_phase[n];
891+ TRANSFORM
892+ }
893+ break;
894+ case 3:
895+ for (int n = 0; n < rdft_size; n++) {
896+ mag = lfe_mag[n];
897+ ph = c_phase[n];
898+ TRANSFORM
899+ }
900+ break;
901+ case 4:
902+ for (int n = 0; n < rdft_size; n++) {
903+ mag = powf(1.f - fabsf(x[n]), bc_x) * powf((1.f - y[n]) * .5f, bc_y) * mag_total[n];
904+ ph = c_phase[n];
905+ TRANSFORM
906+ }
907+ break;
908+ case 5:
909+ for (int n = 0; n < rdft_size; n++) {
910+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
911+ ph = l_phase[n];
912+ TRANSFORM
913+ }
914+ break;
915+ case 6:
916+ for (int n = 0; n < rdft_size; n++) {
917+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
918+ ph = r_phase[n];
919+ TRANSFORM
920+ }
921+ break;
922+ }
784923
785− dstb[2 * n ] = b_mag * cosf(c_phase);
786− dstb[2 * n + 1] = b_mag * sinf(c_phase);
924+ return 0;
787925 }
788926
789927 static void upmix_5_1_back_surround(AVFilterContext *ctx,
@@ -878,110 +1016,176 @@ static void upmix_5_1_back_2_1(AVFilterContext *ctx, · 88 unmodified lines
8781016 dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
8791017 }
8801018
881−static void upmix_7_0(AVFilterContext *ctx,
882− float l_phase,
883− float r_phase,
884− float c_phase,
885− float mag_total,
886− float x, float y,
887− int n)
1019+static int upmix_7_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
8881020 {
889− float l_mag, r_mag, ls_mag, rs_mag, c_mag, lb_mag, rb_mag;
890− float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb;
8911021 AudioSurroundContext *s = ctx->priv;
1022+ float *dst = (float *)s->output->extended_data[ch];
1023+ const float *mag_total = s->mag_total;
1024+ const int rdft_size = s->rdft_size;
1025+ const float *l_phase = s->l_phase;
1026+ const float *r_phase = s->r_phase;
1027+ const float *c_phase = s->c_phase;
1028+ const float fl_x = s->fl_x;
1029+ const float fl_y = s->fl_y;
1030+ const float fr_x = s->fr_x;
1031+ const float fr_y = s->fr_y;
1032+ const float fc_x = s->fc_x;
1033+ const float fc_y = s->fc_y;
1034+ const float bl_x = s->bl_x;
1035+ const float bl_y = s->bl_y;
1036+ const float br_x = s->br_x;
1037+ const float br_y = s->br_y;
1038+ const float sl_x = s->sl_x;
1039+ const float sl_y = s->sl_y;
1040+ const float sr_x = s->sr_x;
1041+ const float sr_y = s->sr_y;
1042+ const float *x = s->x_pos;
1043+ const float *y = s->y_pos;
1044+ float mag, ph;
1045+
1046+ switch (ch) {
1047+ case 0:
1048+ for (int n = 0; n < rdft_size; n++) {
1049+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
1050+ ph = l_phase[n];
1051+ TRANSFORM
1052+ }
1053+ break;
1054+ case 1:
1055+ for (int n = 0; n < rdft_size; n++) {
1056+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
1057+ ph = r_phase[n];
1058+ TRANSFORM
1059+ }
1060+ break;
1061+ case 2:
1062+ for (int n = 0; n < rdft_size; n++) {
1063+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
1064+ ph = c_phase[n];
1065+ TRANSFORM
1066+ }
1067+ break;
1068+ case 3:
1069+ for (int n = 0; n < rdft_size; n++) {
1070+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
1071+ ph = l_phase[n];
1072+ TRANSFORM
1073+ }
1074+ break;
1075+ case 4:
1076+ for (int n = 0; n < rdft_size; n++) {
1077+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
1078+ ph = r_phase[n];
1079+ TRANSFORM
1080+ }
1081+ break;
1082+ case 5:
1083+ for (int n = 0; n < rdft_size; n++) {
1084+ mag = powf(.5f * ( x[n] + 1.f), sl_x) * powf(1.f - fabsf(y[n]), sl_y) * mag_total[n];
1085+ ph = l_phase[n];
1086+ TRANSFORM
1087+ }
1088+ break;
1089+ case 6:
1090+ for (int n = 0; n < rdft_size; n++) {
1091+ mag = powf(.5f * (-x[n] + 1.f), sr_x) * powf(1.f - fabsf(y[n]), sr_y) * mag_total[n];
1092+ ph = r_phase[n];
1093+ TRANSFORM
1094+ }
1095+ break;
1096+ }
8921097
893− dstl = (float *)s->output->extended_data[0];
894− dstr = (float *)s->output->extended_data[1];
895− dstc = (float *)s->output->extended_data[2];
896− dstlb = (float *)s->output->extended_data[3];
897− dstrb = (float *)s->output->extended_data[4];
898− dstls = (float *)s->output->extended_data[5];
899− dstrs = (float *)s->output->extended_data[6];
900−
901− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
902− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
903− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
904− lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
905− rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
906− ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
907− rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
908−
909− dstl[2 * n ] = l_mag * cosf(l_phase);
910− dstl[2 * n + 1] = l_mag * sinf(l_phase);
911−
912− dstr[2 * n ] = r_mag * cosf(r_phase);
913− dstr[2 * n + 1] = r_mag * sinf(r_phase);
914−
915− dstc[2 * n ] = c_mag * cosf(c_phase);
916− dstc[2 * n + 1] = c_mag * sinf(c_phase);
917−
918− dstlb[2 * n ] = lb_mag * cosf(l_phase);
919− dstlb[2 * n + 1] = lb_mag * sinf(l_phase);
920−
921− dstrb[2 * n ] = rb_mag * cosf(r_phase);
922− dstrb[2 * n + 1] = rb_mag * sinf(r_phase);
923−
924− dstls[2 * n ] = ls_mag * cosf(l_phase);
925− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
926−
927− dstrs[2 * n ] = rs_mag * cosf(r_phase);
928− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
1098+ return 0;
9291099 }
9301100
931−static void upmix_7_1(AVFilterContext *ctx,
932− float l_phase,
933− float r_phase,
934− float c_phase,
935− float mag_total,
936− float x, float y,
937− int n)
1101+static int upmix_7_1(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
9381102 {
939− float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, lb_mag, rb_mag;
940− float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb, *dstlfe;
9411103 AudioSurroundContext *s = ctx->priv;
1104+ float *dst = (float *)s->output->extended_data[ch];
1105+ const float *mag_total = s->mag_total;
1106+ const int rdft_size = s->rdft_size;
1107+ const float *lfe_mag = s->lfe_mag;
1108+ const float *l_phase = s->l_phase;
1109+ const float *r_phase = s->r_phase;
1110+ const float *c_phase = s->c_phase;
1111+ const float fl_x = s->fl_x;
1112+ const float fl_y = s->fl_y;
1113+ const float fr_x = s->fr_x;
1114+ const float fr_y = s->fr_y;
1115+ const float fc_x = s->fc_x;
1116+ const float fc_y = s->fc_y;
1117+ const float bl_x = s->bl_x;
1118+ const float bl_y = s->bl_y;
1119+ const float br_x = s->br_x;
1120+ const float br_y = s->br_y;
1121+ const float sl_x = s->sl_x;
1122+ const float sl_y = s->sl_y;
1123+ const float sr_x = s->sr_x;
1124+ const float sr_y = s->sr_y;
1125+ const float *x = s->x_pos;
1126+ const float *y = s->y_pos;
1127+ float mag, ph;
1128+
1129+ switch (ch) {
1130+ case 0:
1131+ for (int n = 0; n < rdft_size; n++) {
1132+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
1133+ ph = l_phase[n];
1134+ TRANSFORM
1135+ }
1136+ break;
1137+ case 1:
1138+ for (int n = 0; n < rdft_size; n++) {
1139+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
1140+ ph = r_phase[n];
1141+ TRANSFORM
1142+ }
1143+ break;
1144+ case 2:
1145+ for (int n = 0; n < rdft_size; n++) {
1146+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
1147+ ph = c_phase[n];
1148+ TRANSFORM
1149+ }
1150+ break;
1151+ case 3:
1152+ for (int n = 0; n < rdft_size; n++) {
1153+ mag = lfe_mag[n];
1154+ ph = c_phase[n];
1155+ TRANSFORM
1156+ }
1157+ break;
1158+ case 4:
1159+ for (int n = 0; n < rdft_size; n++) {
1160+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
1161+ ph = l_phase[n];
1162+ TRANSFORM
1163+ }
1164+ break;
1165+ case 5:
1166+ for (int n = 0; n < rdft_size; n++) {
1167+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
1168+ ph = r_phase[n];
1169+ TRANSFORM
1170+ }
1171+ break;
1172+ case 6:
1173+ for (int n = 0; n < rdft_size; n++) {
1174+ mag = powf(.5f * ( x[n] + 1.f), sl_x) * powf(1.f - fabsf(y[n]), sl_y) * mag_total[n];
1175+ ph = l_phase[n];
1176+ TRANSFORM
1177+ }
1178+ break;
1179+ case 7:
1180+ for (int n = 0; n < rdft_size; n++) {
1181+ mag = powf(.5f * (-x[n] + 1.f), sr_x) * powf(1.f - fabsf(y[n]), sr_y) * mag_total[n];
1182+ ph = r_phase[n];
1183+ TRANSFORM
1184+ }
1185+ break;
1186+ }
9421187
943− dstl = (float *)s->output->extended_data[0];
944− dstr = (float *)s->output->extended_data[1];
945− dstc = (float *)s->output->extended_data[2];
946− dstlfe = (float *)s->output->extended_data[3];
947− dstlb = (float *)s->output->extended_data[4];
948− dstrb = (float *)s->output->extended_data[5];
949− dstls = (float *)s->output->extended_data[6];
950− dstrs = (float *)s->output->extended_data[7];
951−
952− get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
953−
954− c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
955− l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
956− r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
957− lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
958− rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
959− ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
960− rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
961−
962− dstl[2 * n ] = l_mag * cosf(l_phase);
963− dstl[2 * n + 1] = l_mag * sinf(l_phase);
964−
965− dstr[2 * n ] = r_mag * cosf(r_phase);
966− dstr[2 * n + 1] = r_mag * sinf(r_phase);
967−
968− dstc[2 * n ] = c_mag * cosf(c_phase);
969− dstc[2 * n + 1] = c_mag * sinf(c_phase);
970−
971− dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
972− dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
973−
974− dstlb[2 * n ] = lb_mag * cosf(l_phase);
975− dstlb[2 * n + 1] = lb_mag * sinf(l_phase);
976−
977− dstrb[2 * n ] = rb_mag * cosf(r_phase);
978− dstrb[2 * n + 1] = rb_mag * sinf(r_phase);
979−
980− dstls[2 * n ] = ls_mag * cosf(l_phase);
981− dstls[2 * n + 1] = ls_mag * sinf(l_phase);
982−
983− dstrs[2 * n ] = rs_mag * cosf(r_phase);
984− dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
1188+ return 0;
9851189 }
9861190
9871191 static void upmix_7_1_5_0_side(AVFilterContext *ctx,
@@ -1100,16 +1304,116 @@ static void upmix_7_1_5_1(AVFilterContext *ctx, · 112 unmodified lines
11001304 dstrs[2 * n + 1] = rs_mag * sinf(sr_phase);
11011305 }
11021306
1103−static void filter_stereo(AVFilterContext *ctx)
1307+static int upmix_8_0(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
11041308 {
11051309 AudioSurroundContext *s = ctx->priv;
1106− float *srcl, *srcr;
1107− int n;
1310+ float *dst = (float *)s->output->extended_data[ch];
1311+ const float *mag_total = s->mag_total;
1312+ const int rdft_size = s->rdft_size;
1313+ const float *l_phase = s->l_phase;
1314+ const float *r_phase = s->r_phase;
1315+ const float *c_phase = s->c_phase;
1316+ const float fl_x = s->fl_x;
1317+ const float fl_y = s->fl_y;
1318+ const float fr_x = s->fr_x;
1319+ const float fr_y = s->fr_y;
1320+ const float fc_x = s->fc_x;
1321+ const float fc_y = s->fc_y;
1322+ const float bl_x = s->bl_x;
1323+ const float bl_y = s->bl_y;
1324+ const float br_x = s->br_x;
1325+ const float br_y = s->br_y;
1326+ const float sl_x = s->sl_x;
1327+ const float sl_y = s->sl_y;
1328+ const float sr_x = s->sr_x;
1329+ const float sr_y = s->sr_y;
1330+ const float bc_x = s->bc_x;
1331+ const float bc_y = s->bc_y;
1332+ const float *x = s->x_pos;
1333+ const float *y = s->y_pos;
1334+ float mag, ph;
1335+
1336+ switch (ch) {
1337+ case 0:
1338+ for (int n = 0; n < rdft_size; n++) {
1339+ mag = powf(.5f * ( x[n] + 1.f), fl_x) * powf((y[n] + 1.f) * .5f, fl_y) * mag_total[n];
1340+ ph = l_phase[n];
1341+ TRANSFORM
1342+ }
1343+ break;
1344+ case 1:
1345+ for (int n = 0; n < rdft_size; n++) {
1346+ mag = powf(.5f * (-x[n] + 1.f), fr_x) * powf((y[n] + 1.f) * .5f, fr_y) * mag_total[n];
1347+ ph = r_phase[n];
1348+ TRANSFORM
1349+ }
1350+ break;
1351+ case 2:
1352+ for (int n = 0; n < rdft_size; n++) {
1353+ mag = powf(1.f - fabsf(x[n]), fc_x) * powf((y[n] + 1.f) * .5f, fc_y) * mag_total[n];
1354+ ph = c_phase[n];
1355+ TRANSFORM
1356+ }
1357+ break;
1358+ case 3:
1359+ for (int n = 0; n < rdft_size; n++) {
1360+ mag = powf(.5f * ( x[n] + 1.f), bl_x) * powf(1.f - ((y[n] + 1.f) * .5f), bl_y) * mag_total[n];
1361+ ph = l_phase[n];
1362+ TRANSFORM
1363+ }
1364+ break;
1365+ case 4:
1366+ for (int n = 0; n < rdft_size; n++) {
1367+ mag = powf(.5f * (-x[n] + 1.f), br_x) * powf(1.f - ((y[n] + 1.f) * .5f), br_y) * mag_total[n];
1368+ ph = r_phase[n];
1369+ TRANSFORM
1370+ }
1371+ break;
1372+ case 5:
1373+ for (int n = 0; n < rdft_size; n++) {
1374+ mag = powf(1.f - fabsf(x[n]), bc_x) * powf((1.f - y[n]) * .5f, bc_y) * mag_total[n];
1375+ ph = l_phase[n];
1376+ TRANSFORM
1377+ }
1378+ break;
1379+ case 6:
1380+ for (int n = 0; n < rdft_size; n++) {
1381+ mag = powf(.5f * ( x[n] + 1.f), sl_x) * powf(1.f - fabsf(y[n]), sl_y) * mag_total[n];
1382+ ph = l_phase[n];
1383+ TRANSFORM
1384+ }
1385+ break;
1386+ case 7:
1387+ for (int n = 0; n < rdft_size; n++) {
1388+ mag = powf(.5f * (-x[n] + 1.f), sr_x) * powf(1.f - fabsf(y[n]), sr_y) * mag_total[n];
1389+ ph = r_phase[n];
1390+ TRANSFORM
1391+ }
1392+ break;
1393+ }
11081394
1109− srcl = (float *)s->input->extended_data[0];
1110− srcr = (float *)s->input->extended_data[1];
1395+ return 0;
1396+}
11111397
1112− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1398+static void filter_stereo(AVFilterContext *ctx)
1399+{
1400+ AudioSurroundContext *s = ctx->priv;
1401+ const float *srcl = (const float *)s->input->extended_data[0];
1402+ const float *srcr = (const float *)s->input->extended_data[1];
1403+ const int output_lfe = s->output_lfe && s->have_lfe;
1404+ const int lfe_mode = s->lfe_mode;
1405+ const float highcut = s->highcut;
1406+ const float lowcut = s->lowcut;
1407+ const float angle = s->angle;
1408+ float *magtotal = s->mag_total;
1409+ float *lfemag = s->lfe_mag;
1410+ float *lphase = s->l_phase;
1411+ float *rphase = s->r_phase;
1412+ float *cphase = s->c_phase;
1413+ float *xpos = s->x_pos;
1414+ float *ypos = s->y_pos;
1415+
1416+ for (int n = 0; n < s->rdft_size; n++) {
11131417 float l_re = srcl[2 * n], r_re = srcr[2 * n];
11141418 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
11151419 float c_phase = atan2f(l_im + r_im, l_re + r_re);
@@ -1127,9 +1431,15 @@ static void filter_stereo(AVFilterContext *ctx) · 11 unmodified lines
11271431 phase_dif = 2 * M_PI - phase_dif;
11281432
11291433 stereo_position(mag_dif, phase_dif, &x, &y);
1130− stereo_transform(&x, &y, s->angle);
1131−
1132− s->upmix_stereo(ctx, l_phase, r_phase, c_phase, mag_total, x, y, n);
1434+ stereo_transform(&x, &y, angle);
1435+ get_lfe(output_lfe, n, lowcut, highcut, &lfemag[n], &mag_total, lfe_mode);
1436+
1437+ xpos[n] = x;
1438+ ypos[n] = y;
1439+ lphase[n] = l_phase;
1440+ rphase[n] = r_phase;
1441+ cphase[n] = c_phase;
1442+ magtotal[n] = mag_total;
11331443 }
11341444 }
11351445
@@ -1143,7 +1453,7 @@ static void filter_surround(AVFilterContext *ctx) · 7 unmodified lines
11431453 srcr = (float *)s->input->extended_data[1];
11441454 srcc = (float *)s->input->extended_data[2];
11451455
1146− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1456+ for (n = 0; n < s->rdft_size; n++) {
11471457 float l_re = srcl[2 * n], r_re = srcr[2 * n];
11481458 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
11491459 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1179,7 +1489,7 @@ static void filter_2_1(AVFilterContext *ctx) · 29 unmodified lines
11791489 srcr = (float *)s->input->extended_data[1];
11801490 srclfe = (float *)s->input->extended_data[2];
11811491
1182− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1492+ for (n = 0; n < s->rdft_size; n++) {
11831493 float l_re = srcl[2 * n], r_re = srcr[2 * n];
11841494 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
11851495 float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];
@@ -1216,7 +1526,7 @@ static void filter_5_0_side(AVFilterContext *ctx) · 30 unmodified lines
12161526 srcsl = (float *)s->input->extended_data[3];
12171527 srcsr = (float *)s->input->extended_data[4];
12181528
1219− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1529+ for (n = 0; n < s->rdft_size; n++) {
12201530 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
12211531 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
12221532 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1274,7 +1584,7 @@ static void filter_5_1_side(AVFilterContext *ctx) · 51 unmodified lines
12741584 srcsl = (float *)s->input->extended_data[4];
12751585 srcsr = (float *)s->input->extended_data[5];
12761586
1277− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1587+ for (n = 0; n < s->rdft_size; n++) {
12781588 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
12791589 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
12801590 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1333,7 +1643,7 @@ static void filter_5_1_back(AVFilterContext *ctx) · 52 unmodified lines
13331643 srcbl = (float *)s->input->extended_data[4];
13341644 srcbr = (float *)s->input->extended_data[5];
13351645
1336− for (n = 0; n < s->buf_size / 2 + 1; n++) {
1646+ for (n = 0; n < s->rdft_size; n++) {
13371647 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
13381648 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
13391649 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1409,48 +1719,59 @@ static av_cold int init(AVFilterContext *ctx) · 69 unmodified lines
14091719 out_channel_layout = s->out_channel_layout.order == AV_CHANNEL_ORDER_NATIVE ?
14101720 s->out_channel_layout.u.mask : 0;
14111721
1722+ s->have_lfe = 0;
1723+
14121724 switch (in_channel_layout) {
14131725 case AV_CH_LAYOUT_STEREO:
14141726 s->filter = filter_stereo;
14151727 switch (out_channel_layout) {
14161728 case AV_CH_LAYOUT_MONO:
1417− s->upmix_stereo = upmix_1_0;
1729+ s->upmix = upmix_1_0;
14181730 break;
14191731 case AV_CH_LAYOUT_STEREO:
1420− s->upmix_stereo = upmix_stereo;
1732+ s->upmix = upmix_stereo;
14211733 break;
14221734 case AV_CH_LAYOUT_2POINT1:
1423− s->upmix_stereo = upmix_2_1;
1735+ s->upmix = upmix_2_1;
1736+ s->have_lfe = 1;
14241737 break;
14251738 case AV_CH_LAYOUT_SURROUND:
1426− s->upmix_stereo = upmix_3_0;
1739+ s->upmix = upmix_3_0;
14271740 break;
14281741 case AV_CH_LAYOUT_3POINT1:
1429− s->upmix_stereo = upmix_3_1;
1742+ s->upmix = upmix_3_1;
1743+ s->have_lfe = 1;
14301744 break;
14311745 case AV_CH_LAYOUT_4POINT0:
1432− s->upmix_stereo = upmix_4_0;
1746+ s->upmix = upmix_4_0;
14331747 break;
14341748 case AV_CH_LAYOUT_4POINT1:
1435− s->upmix_stereo = upmix_4_1;
1749+ s->upmix = upmix_4_1;
1750+ s->have_lfe = 1;
14361751 break;
14371752 case AV_CH_LAYOUT_5POINT0_BACK:
1438− s->upmix_stereo = upmix_5_0_back;
1753+ s->upmix = upmix_5_0_back;
14391754 break;
14401755 case AV_CH_LAYOUT_5POINT1_BACK:
1441− s->upmix_stereo = upmix_5_1_back;
1756+ s->upmix = upmix_5_1_back;
1757+ s->have_lfe = 1;
14421758 break;
14431759 case AV_CH_LAYOUT_6POINT0:
1444− s->upmix_stereo = upmix_6_0;
1760+ s->upmix = upmix_6_0;
14451761 break;
14461762 case AV_CH_LAYOUT_6POINT1:
1447− s->upmix_stereo = upmix_6_1;
1763+ s->upmix = upmix_6_1;
1764+ s->have_lfe = 1;
14481765 break;
14491766 case AV_CH_LAYOUT_7POINT0:
1450− s->upmix_stereo = upmix_7_0;
1767+ s->upmix = upmix_7_0;
14511768 break;
14521769 case AV_CH_LAYOUT_7POINT1:
1453− s->upmix_stereo = upmix_7_1;
1770+ s->upmix = upmix_7_1;
1771+ s->have_lfe = 1;
1772+ break;
1773+ case AV_CH_LAYOUT_OCTAGONAL:
1774+ s->upmix = upmix_8_0;
14541775 break;
14551776 default:
14561777 goto fail;
@@ -1461,6 +1782,7 @@ static av_cold int init(AVFilterContext *ctx) · 4 unmodified lines
14611782 switch (out_channel_layout) {
14621783 case AV_CH_LAYOUT_5POINT1_BACK:
14631784 s->upmix_2_1 = upmix_5_1_back_2_1;
1785+ s->have_lfe = 1;
14641786 break;
14651787 default:
14661788 goto fail;
@@ -1471,9 +1793,11 @@ static av_cold int init(AVFilterContext *ctx) · 4 unmodified lines
14711793 switch (out_channel_layout) {
14721794 case AV_CH_LAYOUT_3POINT1:
14731795 s->upmix_3_0 = upmix_3_1_surround;
1796+ s->have_lfe = 1;
14741797 break;
14751798 case AV_CH_LAYOUT_5POINT1_BACK:
14761799 s->upmix_3_0 = upmix_5_1_back_surround;
1800+ s->have_lfe = 1;
14771801 break;
14781802 default:
14791803 goto fail;
@@ -1484,6 +1808,7 @@ static av_cold int init(AVFilterContext *ctx) · 4 unmodified lines
14841808 switch (out_channel_layout) {
14851809 case AV_CH_LAYOUT_7POINT1:
14861810 s->upmix_5_0 = upmix_7_1_5_0_side;
1811+ s->have_lfe = 1;
14871812 break;
14881813 default:
14891814 goto fail;
@@ -1494,6 +1819,7 @@ static av_cold int init(AVFilterContext *ctx) · 4 unmodified lines
14941819 switch (out_channel_layout) {
14951820 case AV_CH_LAYOUT_7POINT1:
14961821 s->upmix_5_1 = upmix_7_1_5_1;
1822+ s->have_lfe = 1;
14971823 break;
14981824 default:
14991825 goto fail;
@@ -1504,6 +1830,7 @@ static av_cold int init(AVFilterContext *ctx) · 4 unmodified lines
15041830 switch (out_channel_layout) {
15051831 case AV_CH_LAYOUT_7POINT1:
15061832 s->upmix_5_1 = upmix_7_1_5_1;
1833+ s->have_lfe = 1;
15071834 break;
15081835 default:
15091836 goto fail;
@@ -1540,35 +1867,43 @@ fail: · 30 unmodified lines
15401867 return 0;
15411868 }
15421869
1543−static int fft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
1870+static int fft_channel(AVFilterContext *ctx, AVFrame *in, int ch)
15441871 {
15451872 AudioSurroundContext *s = ctx->priv;
15461873 float *src = (float *)s->input_in->extended_data[ch];
15471874 float *win = (float *)s->window->extended_data[ch];
15481875 const int offset = s->buf_size - s->hop_size;
15491876 const float level_in = s->input_levels[ch];
1550− AVFrame *in = arg;
15511877
15521878 memmove(src, &src[s->hop_size], offset * sizeof(float));
15531879 memcpy(&src[offset], in->extended_data[ch], in->nb_samples * sizeof(float));
15541880 memset(&src[offset + in->nb_samples], 0, (s->hop_size - in->nb_samples) * sizeof(float));
15551881
1556− for (int n = 0; n < s->buf_size; n++) {
1882+ for (int n = 0; n < s->buf_size; n++)
15571883 win[n] = src[n] * s->window_func_lut[n] * level_in;
1558− }
15591884
15601885 s->tx_fn(s->rdft[ch], (float *)s->input->extended_data[ch], win, sizeof(float));
15611886
15621887 return 0;
15631888 }
15641889
1565−static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
1890+static int fft_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
1891+{
1892+ AVFrame *in = arg;
1893+ const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
1894+ const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
1895+
1896+ for (int ch = start; ch < end; ch++)
1897+ fft_channel(ctx, in, ch);
1898+
1899+ return 0;
1900+}
1901+
1902+static int ifft_channel(AVFilterContext *ctx, AVFrame *out, int ch)
15661903 {
15671904 AudioSurroundContext *s = ctx->priv;
15681905 const float level_out = s->output_levels[ch];
1569− AVFrame *out = arg;
15701906 float *dst, *ptr;
1571− int n;
15721907
15731908 dst = (float *)s->output_out->extended_data[ch];
15741909 ptr = (float *)s->overlap_buffer->extended_data[ch];
@@ -1580,9 +1915,8 @@ static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) · 5 unmodified lines
15801915 memset(s->overlap_buffer->extended_data[ch] + s->buf_size * sizeof(float),
15811916 0, s->hop_size * sizeof(float));
15821917
1583− for (n = 0; n < s->buf_size; n++) {
1918+ for (int n = 0; n < s->buf_size; n++)
15841919 ptr[n] += dst[n] * s->window_func_lut[n] * level_out;
1585− }
15861920
15871921 ptr = (float *)s->overlap_buffer->extended_data[ch];
15881922 dst = (float *)out->extended_data[ch];
@@ -1591,6 +1925,18 @@ static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) · 2 unmodified lines
15911925 return 0;
15921926 }
15931927
1928+static int ifft_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
1929+{
1930+ AVFrame *out = arg;
1931+ const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
1932+ const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
1933+
1934+ for (int ch = start; ch < end; ch++)
1935+ ifft_channel(ctx, out, ch);
1936+
1937+ return 0;
1938+}
1939+
15941940 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
15951941 {
15961942 AVFilterContext *ctx = inlink->dst;
@@ -1598,15 +1944,20 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 1 unmodified line
15981944 AudioSurroundContext *s = ctx->priv;
15991945 AVFrame *out;
16001946
1601− ff_filter_execute(ctx, fft_channel, in, NULL, inlink->ch_layout.nb_channels);
1947+ ff_filter_execute(ctx, fft_channels, in, NULL,
1948+ FFMIN(inlink->ch_layout.nb_channels,
1949+ ff_filter_get_nb_threads(ctx)));
16021950
16031951 s->filter(ctx);
1952+ ff_filter_execute(ctx, s->upmix, NULL, NULL, outlink->ch_layout.nb_channels);
16041953
16051954 out = ff_get_audio_buffer(outlink, s->hop_size);
16061955 if (!out)
16071956 return AVERROR(ENOMEM);
16081957
1609− ff_filter_execute(ctx, ifft_channel, out, NULL, outlink->ch_layout.nb_channels);
1958+ ff_filter_execute(ctx, ifft_channels, out, NULL,
1959+ FFMIN(outlink->ch_layout.nb_channels,
1960+ ff_filter_get_nb_threads(ctx)));
16101961
16111962 out->pts = in->pts;
16121963 out->nb_samples = in->nb_samples;
@@ -1670,6 +2021,14 @@ static av_cold void uninit(AVFilterContext *ctx) · 57 unmodified lines
16702021 av_freep(&s->rdft);
16712022 av_freep(&s->irdft);
16722023 av_freep(&s->window_func_lut);
2024+
2025+ av_freep(&s->x_pos);
2026+ av_freep(&s->y_pos);
2027+ av_freep(&s->l_phase);
2028+ av_freep(&s->r_phase);
2029+ av_freep(&s->c_phase);
2030+ av_freep(&s->mag_total);
2031+ av_freep(&s->lfe_mag);
16732032 }
16742033
16752034 #define OFFSET(x) offsetof(AudioSurroundContext, x)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t