History

avfilter/af_surround: split factors calculations

From multiplication with magnitude.

Paul B Mahol committed 3 years ago

Commit 3d330031 parent 08b4c3d1 file · +80 −53Browse files

Showing the changes to libavfilter (1 of 1 file). Show all

Unified · Split

libavfilter/af_surround.c+80−53
@@ -96,9 +96,12 @@ typedef struct AudioSurroundContext { · 95 unmodified lines
9696 int nb_in_channels;
9797 int nb_out_channels;
9898
99+ AVFrame *factors;
99100 AVFrame *input_in;
100101 AVFrame *input;
101102 AVFrame *output;
103+ AVFrame *output_mag;
104+ AVFrame *output_ph;
102105 AVFrame *output_out;
103106 AVFrame *overlap_buffer;
104107 AVFrame *window;
@@ -293,10 +296,14 @@ static int config_output(AVFilterLink *outlink) · 188 unmodified lines
293296
294297 set_output_levels(ctx);
295298
299+ s->factors = ff_get_audio_buffer(outlink, s->win_size + 2);
300+ s->output_ph = ff_get_audio_buffer(outlink, s->win_size + 2);
301+ s->output_mag = ff_get_audio_buffer(outlink, s->win_size + 2);
296302 s->output_out = ff_get_audio_buffer(outlink, s->win_size + 2);
297303 s->output = ff_get_audio_buffer(outlink, s->win_size + 2);
298304 s->overlap_buffer = ff_get_audio_buffer(outlink, s->win_size * 2);
299− if (!s->overlap_buffer || !s->output || !s->output_out)
305+ if (!s->overlap_buffer || !s->output || !s->output_out || !s->output_mag ||
306+ !s->output_ph || !s->factors)
300307 return AVERROR(ENOMEM);
301308
302309 s->rdft_size = s->win_size / 2 + 1;
@@ -397,6 +404,9 @@ static int stereo_upmix(AVFilterContext *ctx, int ch) · 94 unmodified lines
397404 {
398405 AudioSurroundContext *s = ctx->priv;
399406 float *dst = (float *)s->output->extended_data[ch];
407+ float *factor = (float *)s->factors->extended_data[ch];
408+ float *omag = (float *)s->output_mag->extended_data[ch];
409+ float *oph = (float *)s->output_ph->extended_data[ch];
400410 const float *mag_total = s->mag_total;
401411 const int rdft_size = s->rdft_size;
402412 const float *c_phase = s->c_phase;
@@ -412,81 +422,95 @@ static int stereo_upmix(AVFilterContext *ctx, int ch) · 9 unmodified lines
412422
413423 switch (chan) {
414424 case AV_CHAN_FRONT_CENTER:
415− for (int n = 0; n < rdft_size; n++) {
416− float mag = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y) * c_mag[n];
417− float ph = c_phase[n];
418−
419− TRANSFORM
420− }
425+ for (int n = 0; n < rdft_size; n++)
426+ factor[n] = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y);
421427 break;
422428 case AV_CHAN_FRONT_LEFT:
423− for (int n = 0; n < rdft_size; n++) {
424− float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
425− float ph = l_phase[n];
426−
427− TRANSFORM
428− }
429+ for (int n = 0; n < rdft_size; n++)
430+ factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y);
429431 break;
430432 case AV_CHAN_FRONT_RIGHT:
431− for (int n = 0; n < rdft_size; n++) {
432− float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
433− float ph = r_phase[n];
434−
435− TRANSFORM
436− }
433+ for (int n = 0; n < rdft_size; n++)
434+ factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y);
437435 break;
438436 case AV_CHAN_LOW_FREQUENCY:
439− for (int n = 0; n < rdft_size; n++) {
440− float mag = lfe_mag[n];
441− float ph = c_phase[n];
442−
443− TRANSFORM
444− }
437+ for (int n = 0; n < rdft_size; n++)
438+ factor[n] = lfe_mag[n];
445439 break;
446440 case AV_CHAN_BACK_CENTER:
447− for (int n = 0; n < rdft_size; n++) {
448− float mag = powf(1.f - fabsf(x[n]), f_x) * powf((1.f - y[n]) * .5f, f_y) * mag_total[n];
449− float ph = c_phase[n];
450−
451− TRANSFORM
452− }
441+ for (int n = 0; n < rdft_size; n++)
442+ factor[n] = powf(1.f - fabsf(x[n]), f_x) * powf((1.f - y[n]) * .5f, f_y);
453443 break;
454444 case AV_CHAN_BACK_LEFT:
455− for (int n = 0; n < rdft_size; n++) {
456− float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n];
457− float ph = l_phase[n];
458−
459− TRANSFORM
460− }
445+ for (int n = 0; n < rdft_size; n++)
446+ factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y);
461447 break;
462448 case AV_CHAN_BACK_RIGHT:
463− for (int n = 0; n < rdft_size; n++) {
464− float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n];
465− float ph = r_phase[n];
466−
467− TRANSFORM
468− }
449+ for (int n = 0; n < rdft_size; n++)
450+ factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y);
469451 break;
470452 case AV_CHAN_SIDE_LEFT:
471− for (int n = 0; n < rdft_size; n++) {
472− float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n];
473− float ph = l_phase[n];
453+ for (int n = 0; n < rdft_size; n++)
454+ factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y);
455+ break;
456+ case AV_CHAN_SIDE_RIGHT:
457+ for (int n = 0; n < rdft_size; n++)
458+ factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y);
459+ break;
460+ default:
461+ break;
462+ }
474463
475− TRANSFORM
476− }
464+ switch (chan) {
465+ case AV_CHAN_FRONT_CENTER:
466+ memcpy(omag, c_mag, rdft_size * sizeof(*omag));
477467 break;
468+ case AV_CHAN_LOW_FREQUENCY:
469+ memcpy(omag, lfe_mag, rdft_size * sizeof(*omag));
470+ break;
471+ case AV_CHAN_FRONT_LEFT:
472+ case AV_CHAN_FRONT_RIGHT:
473+ case AV_CHAN_BACK_CENTER:
474+ case AV_CHAN_BACK_LEFT:
475+ case AV_CHAN_BACK_RIGHT:
476+ case AV_CHAN_SIDE_LEFT:
478477 case AV_CHAN_SIDE_RIGHT:
479− for (int n = 0; n < rdft_size; n++) {
480− float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n];
481− float ph = r_phase[n];
478+ memcpy(omag, mag_total, rdft_size * sizeof(*omag));
479+ break;
480+ default:
481+ break;
482+ }
482483
483− TRANSFORM
484− }
484+ switch (chan) {
485+ case AV_CHAN_FRONT_CENTER:
486+ case AV_CHAN_LOW_FREQUENCY:
487+ case AV_CHAN_BACK_CENTER:
488+ memcpy(oph, c_phase, rdft_size * sizeof(*oph));
489+ break;
490+ case AV_CHAN_FRONT_LEFT:
491+ case AV_CHAN_BACK_LEFT:
492+ case AV_CHAN_SIDE_LEFT:
493+ memcpy(oph, l_phase, rdft_size * sizeof(*oph));
494+ break;
495+ case AV_CHAN_FRONT_RIGHT:
496+ case AV_CHAN_BACK_RIGHT:
497+ case AV_CHAN_SIDE_RIGHT:
498+ memcpy(oph, r_phase, rdft_size * sizeof(*oph));
485499 break;
486500 default:
487501 break;
488502 }
489503
504+ for (int n = 0; n < rdft_size; n++)
505+ omag[n] *= factor[n];
506+
507+ for (int n = 0; n < rdft_size; n++) {
508+ const float mag = omag[n];
509+ const float ph = oph[n];
510+
511+ TRANSFORM
512+ }
513+
490514 return 0;
491515 }
492516
@@ -1329,10 +1353,13 @@ static av_cold void uninit(AVFilterContext *ctx) · 836 unmodified lines
13291353 {
13301354 AudioSurroundContext *s = ctx->priv;
13311355
1356+ av_frame_free(&s->factors);
13321357 av_frame_free(&s->window);
13331358 av_frame_free(&s->input_in);
13341359 av_frame_free(&s->input);
13351360 av_frame_free(&s->output);
1361+ av_frame_free(&s->output_ph);
1362+ av_frame_free(&s->output_mag);
13361363 av_frame_free(&s->output_out);
13371364 av_frame_free(&s->overlap_buffer);
13381365

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