FFmpeg
af_surround.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Paul B Mahol
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/avassert.h"
22 #include "libavutil/audio_fifo.h"
24 #include "libavutil/opt.h"
25 #include "libavcodec/avfft.h"
26 #include "avfilter.h"
27 #include "audio.h"
28 #include "filters.h"
29 #include "internal.h"
30 #include "formats.h"
31 #include "window_func.h"
32 
33 typedef struct AudioSurroundContext {
34  const AVClass *class;
35 
38 
39  float level_in;
40  float level_out;
41  float fc_in;
42  float fc_out;
43  float fl_in;
44  float fl_out;
45  float fr_in;
46  float fr_out;
47  float sl_in;
48  float sl_out;
49  float sr_in;
50  float sr_out;
51  float bl_in;
52  float bl_out;
53  float br_in;
54  float br_out;
55  float bc_in;
56  float bc_out;
57  float lfe_in;
58  float lfe_out;
59  int lfe_mode;
60  float angle;
61  int win_size;
62  int win_func;
63  float overlap;
64 
65  float all_x;
66  float all_y;
67 
68  float fc_x;
69  float fl_x;
70  float fr_x;
71  float bl_x;
72  float br_x;
73  float sl_x;
74  float sr_x;
75  float bc_x;
76 
77  float fc_y;
78  float fl_y;
79  float fr_y;
80  float bl_y;
81  float br_y;
82  float sl_y;
83  float sr_y;
84  float bc_y;
85 
86  float *input_levels;
87  float *output_levels;
89  int lowcutf;
90  int highcutf;
91 
92  float lowcut;
93  float highcut;
94 
99 
103 
104  int buf_size;
105  int hop_size;
109 
110  int64_t pts;
111  int eof;
112 
115  float l_phase,
116  float r_phase,
117  float c_phase,
118  float mag_total,
119  float x, float y,
120  int n);
122  float l_phase,
123  float r_phase,
124  float c_phase,
125  float mag_total,
126  float lfe_im,
127  float lfe_re,
128  float x, float y,
129  int n);
131  float l_phase,
132  float r_phase,
133  float c_mag,
134  float c_phase,
135  float mag_total,
136  float x, float y,
137  int n);
139  float c_re, float c_im,
140  float mag_totall, float mag_totalr,
141  float fl_phase, float fr_phase,
142  float bl_phase, float br_phase,
143  float sl_phase, float sr_phase,
144  float xl, float yl,
145  float xr, float yr,
146  int n);
148  float c_re, float c_im,
149  float lfe_re, float lfe_im,
150  float mag_totall, float mag_totalr,
151  float fl_phase, float fr_phase,
152  float bl_phase, float br_phase,
153  float sl_phase, float sr_phase,
154  float xl, float yl,
155  float xr, float yr,
156  int n);
158 
160 {
161  AudioSurroundContext *s = ctx->priv;
164  int ret;
165 
167  if (ret)
168  return ret;
170  if (ret)
171  return ret;
172 
173  layouts = NULL;
174  ret = ff_add_channel_layout(&layouts, s->out_channel_layout);
175  if (ret)
176  return ret;
177 
178  ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->incfg.channel_layouts);
179  if (ret)
180  return ret;
181 
182  layouts = NULL;
183  ret = ff_add_channel_layout(&layouts, s->in_channel_layout);
184  if (ret)
185  return ret;
186 
187  ret = ff_channel_layouts_ref(layouts, &ctx->inputs[0]->outcfg.channel_layouts);
188  if (ret)
189  return ret;
190 
192 }
193 
195 {
196  AVFilterContext *ctx = inlink->dst;
197  AudioSurroundContext *s = ctx->priv;
198  int ch;
199 
200  s->rdft = av_calloc(inlink->channels, sizeof(*s->rdft));
201  if (!s->rdft)
202  return AVERROR(ENOMEM);
203  s->nb_in_channels = inlink->channels;
204 
205  for (ch = 0; ch < inlink->channels; ch++) {
206  s->rdft[ch] = av_rdft_init(ff_log2(s->buf_size), DFT_R2C);
207  if (!s->rdft[ch])
208  return AVERROR(ENOMEM);
209  }
210  s->input_levels = av_malloc_array(s->nb_in_channels, sizeof(*s->input_levels));
211  if (!s->input_levels)
212  return AVERROR(ENOMEM);
213  for (ch = 0; ch < s->nb_in_channels; ch++)
214  s->input_levels[ch] = s->level_in;
216  if (ch >= 0)
217  s->input_levels[ch] *= s->fc_in;
219  if (ch >= 0)
220  s->input_levels[ch] *= s->fl_in;
222  if (ch >= 0)
223  s->input_levels[ch] *= s->fr_in;
225  if (ch >= 0)
226  s->input_levels[ch] *= s->sl_in;
228  if (ch >= 0)
229  s->input_levels[ch] *= s->sr_in;
231  if (ch >= 0)
232  s->input_levels[ch] *= s->bl_in;
234  if (ch >= 0)
235  s->input_levels[ch] *= s->br_in;
237  if (ch >= 0)
238  s->input_levels[ch] *= s->bc_in;
240  if (ch >= 0)
241  s->input_levels[ch] *= s->lfe_in;
242 
243  s->input = ff_get_audio_buffer(inlink, s->buf_size * 2);
244  if (!s->input)
245  return AVERROR(ENOMEM);
246 
247  s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->buf_size);
248  if (!s->fifo)
249  return AVERROR(ENOMEM);
250 
251  s->lowcut = 1.f * s->lowcutf / (inlink->sample_rate * 0.5) * (s->buf_size / 2);
252  s->highcut = 1.f * s->highcutf / (inlink->sample_rate * 0.5) * (s->buf_size / 2);
253 
254  return 0;
255 }
256 
257 static int config_output(AVFilterLink *outlink)
258 {
259  AVFilterContext *ctx = outlink->src;
260  AudioSurroundContext *s = ctx->priv;
261  int ch;
262 
263  s->irdft = av_calloc(outlink->channels, sizeof(*s->irdft));
264  if (!s->irdft)
265  return AVERROR(ENOMEM);
266  s->nb_out_channels = outlink->channels;
267 
268  for (ch = 0; ch < outlink->channels; ch++) {
269  s->irdft[ch] = av_rdft_init(ff_log2(s->buf_size), IDFT_C2R);
270  if (!s->irdft[ch])
271  return AVERROR(ENOMEM);
272  }
273  s->output_levels = av_malloc_array(s->nb_out_channels, sizeof(*s->output_levels));
274  if (!s->output_levels)
275  return AVERROR(ENOMEM);
276  for (ch = 0; ch < s->nb_out_channels; ch++)
277  s->output_levels[ch] = s->level_out;
279  if (ch >= 0)
280  s->output_levels[ch] *= s->fc_out;
282  if (ch >= 0)
283  s->output_levels[ch] *= s->fl_out;
285  if (ch >= 0)
286  s->output_levels[ch] *= s->fr_out;
288  if (ch >= 0)
289  s->output_levels[ch] *= s->sl_out;
291  if (ch >= 0)
292  s->output_levels[ch] *= s->sr_out;
294  if (ch >= 0)
295  s->output_levels[ch] *= s->bl_out;
297  if (ch >= 0)
298  s->output_levels[ch] *= s->br_out;
300  if (ch >= 0)
301  s->output_levels[ch] *= s->bc_out;
303  if (ch >= 0)
304  s->output_levels[ch] *= s->lfe_out;
305 
306  s->output = ff_get_audio_buffer(outlink, s->buf_size * 2);
307  s->overlap_buffer = ff_get_audio_buffer(outlink, s->buf_size * 2);
308  if (!s->overlap_buffer || !s->output)
309  return AVERROR(ENOMEM);
310 
311  return 0;
312 }
313 
314 static void stereo_transform(float *x, float *y, float angle)
315 {
316  float reference, r, a;
317 
318  if (angle == 90.f)
319  return;
320 
321  reference = angle * M_PI / 180.f;
322  r = hypotf(*x, *y);
323  a = atan2f(*x, *y);
324 
325  if (fabsf(a) <= M_PI_4)
326  a *= reference / M_PI_2;
327  else
328  a = M_PI + 2 * (-2 * M_PI + reference) * (M_PI - fabsf(a)) * FFDIFFSIGN(a, 0) / (3 * M_PI);
329 
330  *x = av_clipf(sinf(a) * r, -1, 1);
331  *y = av_clipf(cosf(a) * r, -1, 1);
332 }
333 
334 static void stereo_position(float a, float p, float *x, float *y)
335 {
336  av_assert2(a >= -1.f && a <= 1.f);
337  av_assert2(p >= 0.f && p <= M_PI);
338  *x = av_clipf(a+a*FFMAX(0, p*p-M_PI_2), -1, 1);
339  *y = av_clipf(cosf(a*M_PI_2+M_PI)*cosf(M_PI_2-p/M_PI)*M_LN10+1, -1, 1);
340 }
341 
342 static inline void get_lfe(int output_lfe, int n, float lowcut, float highcut,
343  float *lfe_mag, float *mag_total, int lfe_mode)
344 {
345  if (output_lfe && n < highcut) {
346  *lfe_mag = n < lowcut ? 1.f : .5f*(1.f+cosf(M_PI*(lowcut-n)/(lowcut-highcut)));
347  *lfe_mag *= *mag_total;
348  if (lfe_mode)
349  *mag_total -= *lfe_mag;
350  } else {
351  *lfe_mag = 0.f;
352  }
353 }
354 
356  float l_phase,
357  float r_phase,
358  float c_phase,
359  float mag_total,
360  float x, float y,
361  int n)
362 {
363  AudioSurroundContext *s = ctx->priv;
364  float mag, *dst;
365 
366  dst = (float *)s->output->extended_data[0];
367 
368  mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
369 
370  dst[2 * n ] = mag * cosf(c_phase);
371  dst[2 * n + 1] = mag * sinf(c_phase);
372 }
373 
375  float l_phase,
376  float r_phase,
377  float c_phase,
378  float mag_total,
379  float x, float y,
380  int n)
381 {
382  AudioSurroundContext *s = ctx->priv;
383  float l_mag, r_mag, *dstl, *dstr;
384 
385  dstl = (float *)s->output->extended_data[0];
386  dstr = (float *)s->output->extended_data[1];
387 
388  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
389  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
390 
391  dstl[2 * n ] = l_mag * cosf(l_phase);
392  dstl[2 * n + 1] = l_mag * sinf(l_phase);
393 
394  dstr[2 * n ] = r_mag * cosf(r_phase);
395  dstr[2 * n + 1] = r_mag * sinf(r_phase);
396 }
397 
399  float l_phase,
400  float r_phase,
401  float c_phase,
402  float mag_total,
403  float x, float y,
404  int n)
405 {
406  AudioSurroundContext *s = ctx->priv;
407  float lfe_mag, l_mag, r_mag, *dstl, *dstr, *dstlfe;
408 
409  dstl = (float *)s->output->extended_data[0];
410  dstr = (float *)s->output->extended_data[1];
411  dstlfe = (float *)s->output->extended_data[2];
412 
413  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
414 
415  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
416  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
417 
418  dstl[2 * n ] = l_mag * cosf(l_phase);
419  dstl[2 * n + 1] = l_mag * sinf(l_phase);
420 
421  dstr[2 * n ] = r_mag * cosf(r_phase);
422  dstr[2 * n + 1] = r_mag * sinf(r_phase);
423 
424  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
425  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
426 }
427 
429  float l_phase,
430  float r_phase,
431  float c_phase,
432  float mag_total,
433  float x, float y,
434  int n)
435 {
436  AudioSurroundContext *s = ctx->priv;
437  float l_mag, r_mag, c_mag, *dstc, *dstl, *dstr;
438 
439  dstl = (float *)s->output->extended_data[0];
440  dstr = (float *)s->output->extended_data[1];
441  dstc = (float *)s->output->extended_data[2];
442 
443  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
444  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
445  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
446 
447  dstl[2 * n ] = l_mag * cosf(l_phase);
448  dstl[2 * n + 1] = l_mag * sinf(l_phase);
449 
450  dstr[2 * n ] = r_mag * cosf(r_phase);
451  dstr[2 * n + 1] = r_mag * sinf(r_phase);
452 
453  dstc[2 * n ] = c_mag * cosf(c_phase);
454  dstc[2 * n + 1] = c_mag * sinf(c_phase);
455 }
456 
458  float l_phase,
459  float r_phase,
460  float c_phase,
461  float mag_total,
462  float x, float y,
463  int n)
464 {
465  AudioSurroundContext *s = ctx->priv;
466  float lfe_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstlfe;
467 
468  dstl = (float *)s->output->extended_data[0];
469  dstr = (float *)s->output->extended_data[1];
470  dstc = (float *)s->output->extended_data[2];
471  dstlfe = (float *)s->output->extended_data[3];
472 
473  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
474 
475  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
476  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
477  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
478 
479  dstl[2 * n ] = l_mag * cosf(l_phase);
480  dstl[2 * n + 1] = l_mag * sinf(l_phase);
481 
482  dstr[2 * n ] = r_mag * cosf(r_phase);
483  dstr[2 * n + 1] = r_mag * sinf(r_phase);
484 
485  dstc[2 * n ] = c_mag * cosf(c_phase);
486  dstc[2 * n + 1] = c_mag * sinf(c_phase);
487 
488  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
489  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
490 }
491 
493  float l_phase,
494  float r_phase,
495  float c_phase,
496  float c_mag,
497  float mag_total,
498  float x, float y,
499  int n)
500 {
501  AudioSurroundContext *s = ctx->priv;
502  float lfe_mag, l_mag, r_mag, *dstc, *dstl, *dstr, *dstlfe;
503 
504  dstl = (float *)s->output->extended_data[0];
505  dstr = (float *)s->output->extended_data[1];
506  dstc = (float *)s->output->extended_data[2];
507  dstlfe = (float *)s->output->extended_data[3];
508 
509  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
510 
511  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
512  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
513 
514  dstl[2 * n ] = l_mag * cosf(l_phase);
515  dstl[2 * n + 1] = l_mag * sinf(l_phase);
516 
517  dstr[2 * n ] = r_mag * cosf(r_phase);
518  dstr[2 * n + 1] = r_mag * sinf(r_phase);
519 
520  dstc[2 * n ] = c_mag * cosf(c_phase);
521  dstc[2 * n + 1] = c_mag * sinf(c_phase);
522 
523  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
524  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
525 }
526 
528  float l_phase,
529  float r_phase,
530  float c_phase,
531  float mag_total,
532  float x, float y,
533  int n)
534 {
535  AudioSurroundContext *s = ctx->priv;
536  float b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb;
537 
538  dstl = (float *)s->output->extended_data[0];
539  dstr = (float *)s->output->extended_data[1];
540  dstc = (float *)s->output->extended_data[2];
541  dstb = (float *)s->output->extended_data[3];
542 
543  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
544  b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
545  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
546  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
547 
548  dstl[2 * n ] = l_mag * cosf(l_phase);
549  dstl[2 * n + 1] = l_mag * sinf(l_phase);
550 
551  dstr[2 * n ] = r_mag * cosf(r_phase);
552  dstr[2 * n + 1] = r_mag * sinf(r_phase);
553 
554  dstc[2 * n ] = c_mag * cosf(c_phase);
555  dstc[2 * n + 1] = c_mag * sinf(c_phase);
556 
557  dstb[2 * n ] = b_mag * cosf(c_phase);
558  dstb[2 * n + 1] = b_mag * sinf(c_phase);
559 }
560 
562  float l_phase,
563  float r_phase,
564  float c_phase,
565  float mag_total,
566  float x, float y,
567  int n)
568 {
569  AudioSurroundContext *s = ctx->priv;
570  float lfe_mag, b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb, *dstlfe;
571 
572  dstl = (float *)s->output->extended_data[0];
573  dstr = (float *)s->output->extended_data[1];
574  dstc = (float *)s->output->extended_data[2];
575  dstlfe = (float *)s->output->extended_data[3];
576  dstb = (float *)s->output->extended_data[4];
577 
578  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
579 
580  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
581  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
582 
583  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
584  b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
585  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
586  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
587 
588  dstl[2 * n ] = l_mag * cosf(l_phase);
589  dstl[2 * n + 1] = l_mag * sinf(l_phase);
590 
591  dstr[2 * n ] = r_mag * cosf(r_phase);
592  dstr[2 * n + 1] = r_mag * sinf(r_phase);
593 
594  dstc[2 * n ] = c_mag * cosf(c_phase);
595  dstc[2 * n + 1] = c_mag * sinf(c_phase);
596 
597  dstb[2 * n ] = b_mag * cosf(c_phase);
598  dstb[2 * n + 1] = b_mag * sinf(c_phase);
599 }
600 
602  float l_phase,
603  float r_phase,
604  float c_phase,
605  float mag_total,
606  float x, float y,
607  int n)
608 {
609  AudioSurroundContext *s = ctx->priv;
610  float l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs;
611 
612  dstl = (float *)s->output->extended_data[0];
613  dstr = (float *)s->output->extended_data[1];
614  dstc = (float *)s->output->extended_data[2];
615  dstls = (float *)s->output->extended_data[3];
616  dstrs = (float *)s->output->extended_data[4];
617 
618  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
619  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
620  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
621  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
622  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
623 
624  dstl[2 * n ] = l_mag * cosf(l_phase);
625  dstl[2 * n + 1] = l_mag * sinf(l_phase);
626 
627  dstr[2 * n ] = r_mag * cosf(r_phase);
628  dstr[2 * n + 1] = r_mag * sinf(r_phase);
629 
630  dstc[2 * n ] = c_mag * cosf(c_phase);
631  dstc[2 * n + 1] = c_mag * sinf(c_phase);
632 
633  dstls[2 * n ] = ls_mag * cosf(l_phase);
634  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
635 
636  dstrs[2 * n ] = rs_mag * cosf(r_phase);
637  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
638 }
639 
641  float l_phase,
642  float r_phase,
643  float c_phase,
644  float mag_total,
645  float x, float y,
646  int n)
647 {
648  AudioSurroundContext *s = ctx->priv;
649  float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
650 
651  dstl = (float *)s->output->extended_data[0];
652  dstr = (float *)s->output->extended_data[1];
653  dstc = (float *)s->output->extended_data[2];
654  dstlfe = (float *)s->output->extended_data[3];
655  dstls = (float *)s->output->extended_data[4];
656  dstrs = (float *)s->output->extended_data[5];
657 
658  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
659 
660  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
661  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
662  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
663  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
664  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
665 
666  dstl[2 * n ] = l_mag * cosf(l_phase);
667  dstl[2 * n + 1] = l_mag * sinf(l_phase);
668 
669  dstr[2 * n ] = r_mag * cosf(r_phase);
670  dstr[2 * n + 1] = r_mag * sinf(r_phase);
671 
672  dstc[2 * n ] = c_mag * cosf(c_phase);
673  dstc[2 * n + 1] = c_mag * sinf(c_phase);
674 
675  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
676  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
677 
678  dstls[2 * n ] = ls_mag * cosf(l_phase);
679  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
680 
681  dstrs[2 * n ] = rs_mag * cosf(r_phase);
682  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
683 }
684 
686  float l_phase,
687  float r_phase,
688  float c_phase,
689  float mag_total,
690  float x, float y,
691  int n)
692 {
693  AudioSurroundContext *s = ctx->priv;
694  float l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs;
695 
696  dstl = (float *)s->output->extended_data[0];
697  dstr = (float *)s->output->extended_data[1];
698  dstc = (float *)s->output->extended_data[2];
699  dstb = (float *)s->output->extended_data[3];
700  dstls = (float *)s->output->extended_data[4];
701  dstrs = (float *)s->output->extended_data[5];
702 
703  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
704  b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
705  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
706  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
707  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
708  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
709 
710  dstl[2 * n ] = l_mag * cosf(l_phase);
711  dstl[2 * n + 1] = l_mag * sinf(l_phase);
712 
713  dstr[2 * n ] = r_mag * cosf(r_phase);
714  dstr[2 * n + 1] = r_mag * sinf(r_phase);
715 
716  dstc[2 * n ] = c_mag * cosf(c_phase);
717  dstc[2 * n + 1] = c_mag * sinf(c_phase);
718 
719  dstls[2 * n ] = ls_mag * cosf(l_phase);
720  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
721 
722  dstrs[2 * n ] = rs_mag * cosf(r_phase);
723  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
724 
725  dstb[2 * n ] = b_mag * cosf(c_phase);
726  dstb[2 * n + 1] = b_mag * sinf(c_phase);
727 }
728 
730  float l_phase,
731  float r_phase,
732  float c_phase,
733  float mag_total,
734  float x, float y,
735  int n)
736 {
737  AudioSurroundContext *s = ctx->priv;
738  float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
739 
740  dstl = (float *)s->output->extended_data[0];
741  dstr = (float *)s->output->extended_data[1];
742  dstc = (float *)s->output->extended_data[2];
743  dstlfe = (float *)s->output->extended_data[3];
744  dstb = (float *)s->output->extended_data[4];
745  dstls = (float *)s->output->extended_data[5];
746  dstrs = (float *)s->output->extended_data[6];
747 
748  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
749 
750  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
751  b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
752  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
753  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
754  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
755  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
756 
757  dstl[2 * n ] = l_mag * cosf(l_phase);
758  dstl[2 * n + 1] = l_mag * sinf(l_phase);
759 
760  dstr[2 * n ] = r_mag * cosf(r_phase);
761  dstr[2 * n + 1] = r_mag * sinf(r_phase);
762 
763  dstc[2 * n ] = c_mag * cosf(c_phase);
764  dstc[2 * n + 1] = c_mag * sinf(c_phase);
765 
766  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
767  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
768 
769  dstls[2 * n ] = ls_mag * cosf(l_phase);
770  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
771 
772  dstrs[2 * n ] = rs_mag * cosf(r_phase);
773  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
774 
775  dstb[2 * n ] = b_mag * cosf(c_phase);
776  dstb[2 * n + 1] = b_mag * sinf(c_phase);
777 }
778 
780  float l_phase,
781  float r_phase,
782  float c_phase,
783  float c_mag,
784  float mag_total,
785  float x, float y,
786  int n)
787 {
788  AudioSurroundContext *s = ctx->priv;
789  float lfe_mag, l_mag, r_mag, *dstc, *dstl, *dstr, *dstlfe;
790  float ls_mag, rs_mag, *dstls, *dstrs;
791 
792  dstl = (float *)s->output->extended_data[0];
793  dstr = (float *)s->output->extended_data[1];
794  dstc = (float *)s->output->extended_data[2];
795  dstlfe = (float *)s->output->extended_data[3];
796  dstls = (float *)s->output->extended_data[4];
797  dstrs = (float *)s->output->extended_data[5];
798 
799  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
800 
801  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
802  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
803  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
804  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
805 
806  dstl[2 * n ] = l_mag * cosf(l_phase);
807  dstl[2 * n + 1] = l_mag * sinf(l_phase);
808 
809  dstr[2 * n ] = r_mag * cosf(r_phase);
810  dstr[2 * n + 1] = r_mag * sinf(r_phase);
811 
812  dstc[2 * n ] = c_mag * cosf(c_phase);
813  dstc[2 * n + 1] = c_mag * sinf(c_phase);
814 
815  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
816  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
817 
818  dstls[2 * n ] = ls_mag * cosf(l_phase);
819  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
820 
821  dstrs[2 * n ] = rs_mag * cosf(r_phase);
822  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
823 }
824 
826  float l_phase,
827  float r_phase,
828  float c_phase,
829  float mag_total,
830  float lfe_re,
831  float lfe_im,
832  float x, float y,
833  int n)
834 {
835  AudioSurroundContext *s = ctx->priv;
836  float c_mag, l_mag, r_mag, *dstc, *dstl, *dstr, *dstlfe;
837  float ls_mag, rs_mag, *dstls, *dstrs;
838 
839  dstl = (float *)s->output->extended_data[0];
840  dstr = (float *)s->output->extended_data[1];
841  dstc = (float *)s->output->extended_data[2];
842  dstlfe = (float *)s->output->extended_data[3];
843  dstls = (float *)s->output->extended_data[4];
844  dstrs = (float *)s->output->extended_data[5];
845 
846  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
847  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
848  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
849  ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
850  rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
851 
852  dstl[2 * n ] = l_mag * cosf(l_phase);
853  dstl[2 * n + 1] = l_mag * sinf(l_phase);
854 
855  dstr[2 * n ] = r_mag * cosf(r_phase);
856  dstr[2 * n + 1] = r_mag * sinf(r_phase);
857 
858  dstc[2 * n ] = c_mag * cosf(c_phase);
859  dstc[2 * n + 1] = c_mag * sinf(c_phase);
860 
861  dstlfe[2 * n ] = lfe_re;
862  dstlfe[2 * n + 1] = lfe_im;
863 
864  dstls[2 * n ] = ls_mag * cosf(l_phase);
865  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
866 
867  dstrs[2 * n ] = rs_mag * cosf(r_phase);
868  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
869 }
870 
872  float l_phase,
873  float r_phase,
874  float c_phase,
875  float mag_total,
876  float x, float y,
877  int n)
878 {
879  float l_mag, r_mag, ls_mag, rs_mag, c_mag, lb_mag, rb_mag;
880  float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb;
881  AudioSurroundContext *s = ctx->priv;
882 
883  dstl = (float *)s->output->extended_data[0];
884  dstr = (float *)s->output->extended_data[1];
885  dstc = (float *)s->output->extended_data[2];
886  dstlb = (float *)s->output->extended_data[3];
887  dstrb = (float *)s->output->extended_data[4];
888  dstls = (float *)s->output->extended_data[5];
889  dstrs = (float *)s->output->extended_data[6];
890 
891  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
892  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
893  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
894  lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
895  rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
896  ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
897  rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
898 
899  dstl[2 * n ] = l_mag * cosf(l_phase);
900  dstl[2 * n + 1] = l_mag * sinf(l_phase);
901 
902  dstr[2 * n ] = r_mag * cosf(r_phase);
903  dstr[2 * n + 1] = r_mag * sinf(r_phase);
904 
905  dstc[2 * n ] = c_mag * cosf(c_phase);
906  dstc[2 * n + 1] = c_mag * sinf(c_phase);
907 
908  dstlb[2 * n ] = lb_mag * cosf(l_phase);
909  dstlb[2 * n + 1] = lb_mag * sinf(l_phase);
910 
911  dstrb[2 * n ] = rb_mag * cosf(r_phase);
912  dstrb[2 * n + 1] = rb_mag * sinf(r_phase);
913 
914  dstls[2 * n ] = ls_mag * cosf(l_phase);
915  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
916 
917  dstrs[2 * n ] = rs_mag * cosf(r_phase);
918  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
919 }
920 
922  float l_phase,
923  float r_phase,
924  float c_phase,
925  float mag_total,
926  float x, float y,
927  int n)
928 {
929  float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, lb_mag, rb_mag;
930  float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb, *dstlfe;
931  AudioSurroundContext *s = ctx->priv;
932 
933  dstl = (float *)s->output->extended_data[0];
934  dstr = (float *)s->output->extended_data[1];
935  dstc = (float *)s->output->extended_data[2];
936  dstlfe = (float *)s->output->extended_data[3];
937  dstlb = (float *)s->output->extended_data[4];
938  dstrb = (float *)s->output->extended_data[5];
939  dstls = (float *)s->output->extended_data[6];
940  dstrs = (float *)s->output->extended_data[7];
941 
942  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
943 
944  c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
945  l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
946  r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
947  lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
948  rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
949  ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
950  rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
951 
952  dstl[2 * n ] = l_mag * cosf(l_phase);
953  dstl[2 * n + 1] = l_mag * sinf(l_phase);
954 
955  dstr[2 * n ] = r_mag * cosf(r_phase);
956  dstr[2 * n + 1] = r_mag * sinf(r_phase);
957 
958  dstc[2 * n ] = c_mag * cosf(c_phase);
959  dstc[2 * n + 1] = c_mag * sinf(c_phase);
960 
961  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
962  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
963 
964  dstlb[2 * n ] = lb_mag * cosf(l_phase);
965  dstlb[2 * n + 1] = lb_mag * sinf(l_phase);
966 
967  dstrb[2 * n ] = rb_mag * cosf(r_phase);
968  dstrb[2 * n + 1] = rb_mag * sinf(r_phase);
969 
970  dstls[2 * n ] = ls_mag * cosf(l_phase);
971  dstls[2 * n + 1] = ls_mag * sinf(l_phase);
972 
973  dstrs[2 * n ] = rs_mag * cosf(r_phase);
974  dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
975 }
976 
978  float c_re, float c_im,
979  float mag_totall, float mag_totalr,
980  float fl_phase, float fr_phase,
981  float bl_phase, float br_phase,
982  float sl_phase, float sr_phase,
983  float xl, float yl,
984  float xr, float yr,
985  int n)
986 {
987  float fl_mag, fr_mag, ls_mag, rs_mag, lb_mag, rb_mag;
988  float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb, *dstlfe;
989  float lfe_mag, c_phase, mag_total = (mag_totall + mag_totalr) * 0.5;
990  AudioSurroundContext *s = ctx->priv;
991 
992  dstl = (float *)s->output->extended_data[0];
993  dstr = (float *)s->output->extended_data[1];
994  dstc = (float *)s->output->extended_data[2];
995  dstlfe = (float *)s->output->extended_data[3];
996  dstlb = (float *)s->output->extended_data[4];
997  dstrb = (float *)s->output->extended_data[5];
998  dstls = (float *)s->output->extended_data[6];
999  dstrs = (float *)s->output->extended_data[7];
1000 
1001  c_phase = atan2f(c_im, c_re);
1002 
1003  get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
1004 
1005  fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
1006  fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
1007  lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
1008  rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
1009  ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
1010  rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
1011 
1012  dstl[2 * n ] = fl_mag * cosf(fl_phase);
1013  dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
1014 
1015  dstr[2 * n ] = fr_mag * cosf(fr_phase);
1016  dstr[2 * n + 1] = fr_mag * sinf(fr_phase);
1017 
1018  dstc[2 * n ] = c_re;
1019  dstc[2 * n + 1] = c_im;
1020 
1021  dstlfe[2 * n ] = lfe_mag * cosf(c_phase);
1022  dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
1023 
1024  dstlb[2 * n ] = lb_mag * cosf(bl_phase);
1025  dstlb[2 * n + 1] = lb_mag * sinf(bl_phase);
1026 
1027  dstrb[2 * n ] = rb_mag * cosf(br_phase);
1028  dstrb[2 * n + 1] = rb_mag * sinf(br_phase);
1029 
1030  dstls[2 * n ] = ls_mag * cosf(sl_phase);
1031  dstls[2 * n + 1] = ls_mag * sinf(sl_phase);
1032 
1033  dstrs[2 * n ] = rs_mag * cosf(sr_phase);
1034  dstrs[2 * n + 1] = rs_mag * sinf(sr_phase);
1035 }
1036 
1038  float c_re, float c_im,
1039  float lfe_re, float lfe_im,
1040  float mag_totall, float mag_totalr,
1041  float fl_phase, float fr_phase,
1042  float bl_phase, float br_phase,
1043  float sl_phase, float sr_phase,
1044  float xl, float yl,
1045  float xr, float yr,
1046  int n)
1047 {
1048  float fl_mag, fr_mag, ls_mag, rs_mag, lb_mag, rb_mag;
1049  float *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlb, *dstrb, *dstlfe;
1050  AudioSurroundContext *s = ctx->priv;
1051 
1052  dstl = (float *)s->output->extended_data[0];
1053  dstr = (float *)s->output->extended_data[1];
1054  dstc = (float *)s->output->extended_data[2];
1055  dstlfe = (float *)s->output->extended_data[3];
1056  dstlb = (float *)s->output->extended_data[4];
1057  dstrb = (float *)s->output->extended_data[5];
1058  dstls = (float *)s->output->extended_data[6];
1059  dstrs = (float *)s->output->extended_data[7];
1060 
1061  fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
1062  fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
1063  lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
1064  rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
1065  ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
1066  rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
1067 
1068  dstl[2 * n ] = fl_mag * cosf(fl_phase);
1069  dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
1070 
1071  dstr[2 * n ] = fr_mag * cosf(fr_phase);
1072  dstr[2 * n + 1] = fr_mag * sinf(fr_phase);
1073 
1074  dstc[2 * n ] = c_re;
1075  dstc[2 * n + 1] = c_im;
1076 
1077  dstlfe[2 * n ] = lfe_re;
1078  dstlfe[2 * n + 1] = lfe_im;
1079 
1080  dstlb[2 * n ] = lb_mag * cosf(bl_phase);
1081  dstlb[2 * n + 1] = lb_mag * sinf(bl_phase);
1082 
1083  dstrb[2 * n ] = rb_mag * cosf(br_phase);
1084  dstrb[2 * n + 1] = rb_mag * sinf(br_phase);
1085 
1086  dstls[2 * n ] = ls_mag * cosf(sl_phase);
1087  dstls[2 * n + 1] = ls_mag * sinf(sl_phase);
1088 
1089  dstrs[2 * n ] = rs_mag * cosf(sr_phase);
1090  dstrs[2 * n + 1] = rs_mag * sinf(sr_phase);
1091 }
1092 
1094 {
1095  AudioSurroundContext *s = ctx->priv;
1096  float *srcl, *srcr;
1097  int n;
1098 
1099  srcl = (float *)s->input->extended_data[0];
1100  srcr = (float *)s->input->extended_data[1];
1101 
1102  for (n = 0; n < s->buf_size; n++) {
1103  float l_re = srcl[2 * n], r_re = srcr[2 * n];
1104  float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1105  float c_phase = atan2f(l_im + r_im, l_re + r_re);
1106  float l_mag = hypotf(l_re, l_im);
1107  float r_mag = hypotf(r_re, r_im);
1108  float l_phase = atan2f(l_im, l_re);
1109  float r_phase = atan2f(r_im, r_re);
1110  float phase_dif = fabsf(l_phase - r_phase);
1111  float mag_sum = l_mag + r_mag;
1112  float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
1113  float mag_total = hypotf(l_mag, r_mag);
1114  float x, y;
1115 
1116  if (phase_dif > M_PI)
1117  phase_dif = 2 * M_PI - phase_dif;
1118 
1119  stereo_position(mag_dif, phase_dif, &x, &y);
1120  stereo_transform(&x, &y, s->angle);
1121 
1122  s->upmix_stereo(ctx, l_phase, r_phase, c_phase, mag_total, x, y, n);
1123  }
1124 }
1125 
1127 {
1128  AudioSurroundContext *s = ctx->priv;
1129  float *srcl, *srcr, *srcc;
1130  int n;
1131 
1132  srcl = (float *)s->input->extended_data[0];
1133  srcr = (float *)s->input->extended_data[1];
1134  srcc = (float *)s->input->extended_data[2];
1135 
1136  for (n = 0; n < s->buf_size; n++) {
1137  float l_re = srcl[2 * n], r_re = srcr[2 * n];
1138  float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1139  float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
1140  float c_mag = hypotf(c_re, c_im);
1141  float c_phase = atan2f(c_im, c_re);
1142  float l_mag = hypotf(l_re, l_im);
1143  float r_mag = hypotf(r_re, r_im);
1144  float l_phase = atan2f(l_im, l_re);
1145  float r_phase = atan2f(r_im, r_re);
1146  float phase_dif = fabsf(l_phase - r_phase);
1147  float mag_sum = l_mag + r_mag;
1148  float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
1149  float mag_total = hypotf(l_mag, r_mag);
1150  float x, y;
1151 
1152  if (phase_dif > M_PI)
1153  phase_dif = 2 * M_PI - phase_dif;
1154 
1155  stereo_position(mag_dif, phase_dif, &x, &y);
1156  stereo_transform(&x, &y, s->angle);
1157 
1158  s->upmix_3_0(ctx, l_phase, r_phase, c_phase, c_mag, mag_total, x, y, n);
1159  }
1160 }
1161 
1163 {
1164  AudioSurroundContext *s = ctx->priv;
1165  float *srcl, *srcr, *srclfe;
1166  int n;
1167 
1168  srcl = (float *)s->input->extended_data[0];
1169  srcr = (float *)s->input->extended_data[1];
1170  srclfe = (float *)s->input->extended_data[2];
1171 
1172  for (n = 0; n < s->buf_size; n++) {
1173  float l_re = srcl[2 * n], r_re = srcr[2 * n];
1174  float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1175  float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];
1176  float c_phase = atan2f(l_im + r_im, l_re + r_re);
1177  float l_mag = hypotf(l_re, l_im);
1178  float r_mag = hypotf(r_re, r_im);
1179  float l_phase = atan2f(l_im, l_re);
1180  float r_phase = atan2f(r_im, r_re);
1181  float phase_dif = fabsf(l_phase - r_phase);
1182  float mag_sum = l_mag + r_mag;
1183  float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
1184  float mag_total = hypotf(l_mag, r_mag);
1185  float x, y;
1186 
1187  if (phase_dif > M_PI)
1188  phase_dif = 2 * M_PI - phase_dif;
1189 
1190  stereo_position(mag_dif, phase_dif, &x, &y);
1191  stereo_transform(&x, &y, s->angle);
1192 
1193  s->upmix_2_1(ctx, l_phase, r_phase, c_phase, mag_total, lfe_re, lfe_im, x, y, n);
1194  }
1195 }
1196 
1198 {
1199  AudioSurroundContext *s = ctx->priv;
1200  float *srcl, *srcr, *srcc, *srcsl, *srcsr;
1201  int n;
1202 
1203  srcl = (float *)s->input->extended_data[0];
1204  srcr = (float *)s->input->extended_data[1];
1205  srcc = (float *)s->input->extended_data[2];
1206  srcsl = (float *)s->input->extended_data[3];
1207  srcsr = (float *)s->input->extended_data[4];
1208 
1209  for (n = 0; n < s->buf_size; n++) {
1210  float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1211  float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1212  float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
1213  float sl_re = srcsl[2 * n], sl_im = srcsl[2 * n + 1];
1214  float sr_re = srcsr[2 * n], sr_im = srcsr[2 * n + 1];
1215  float fl_mag = hypotf(fl_re, fl_im);
1216  float fr_mag = hypotf(fr_re, fr_im);
1217  float fl_phase = atan2f(fl_im, fl_re);
1218  float fr_phase = atan2f(fr_im, fr_re);
1219  float sl_mag = hypotf(sl_re, sl_im);
1220  float sr_mag = hypotf(sr_re, sr_im);
1221  float sl_phase = atan2f(sl_im, sl_re);
1222  float sr_phase = atan2f(sr_im, sr_re);
1223  float phase_difl = fabsf(fl_phase - sl_phase);
1224  float phase_difr = fabsf(fr_phase - sr_phase);
1225  float magl_sum = fl_mag + sl_mag;
1226  float magr_sum = fr_mag + sr_mag;
1227  float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, sl_mag) : (fl_mag - sl_mag) / magl_sum;
1228  float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, sr_mag) : (fr_mag - sr_mag) / magr_sum;
1229  float mag_totall = hypotf(fl_mag, sl_mag);
1230  float mag_totalr = hypotf(fr_mag, sr_mag);
1231  float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re);
1232  float br_phase = atan2f(fr_im + sr_im, fr_re + sr_re);
1233  float xl, yl;
1234  float xr, yr;
1235 
1236  if (phase_difl > M_PI)
1237  phase_difl = 2 * M_PI - phase_difl;
1238 
1239  if (phase_difr > M_PI)
1240  phase_difr = 2 * M_PI - phase_difr;
1241 
1242  stereo_position(mag_difl, phase_difl, &xl, &yl);
1243  stereo_position(mag_difr, phase_difr, &xr, &yr);
1244 
1245  s->upmix_5_0(ctx, c_re, c_im,
1246  mag_totall, mag_totalr,
1247  fl_phase, fr_phase,
1248  bl_phase, br_phase,
1249  sl_phase, sr_phase,
1250  xl, yl, xr, yr, n);
1251  }
1252 }
1253 
1255 {
1256  AudioSurroundContext *s = ctx->priv;
1257  float *srcl, *srcr, *srcc, *srclfe, *srcsl, *srcsr;
1258  int n;
1259 
1260  srcl = (float *)s->input->extended_data[0];
1261  srcr = (float *)s->input->extended_data[1];
1262  srcc = (float *)s->input->extended_data[2];
1263  srclfe = (float *)s->input->extended_data[3];
1264  srcsl = (float *)s->input->extended_data[4];
1265  srcsr = (float *)s->input->extended_data[5];
1266 
1267  for (n = 0; n < s->buf_size; n++) {
1268  float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1269  float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1270  float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
1271  float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];
1272  float sl_re = srcsl[2 * n], sl_im = srcsl[2 * n + 1];
1273  float sr_re = srcsr[2 * n], sr_im = srcsr[2 * n + 1];
1274  float fl_mag = hypotf(fl_re, fl_im);
1275  float fr_mag = hypotf(fr_re, fr_im);
1276  float fl_phase = atan2f(fl_im, fl_re);
1277  float fr_phase = atan2f(fr_im, fr_re);
1278  float sl_mag = hypotf(sl_re, sl_im);
1279  float sr_mag = hypotf(sr_re, sr_im);
1280  float sl_phase = atan2f(sl_im, sl_re);
1281  float sr_phase = atan2f(sr_im, sr_re);
1282  float phase_difl = fabsf(fl_phase - sl_phase);
1283  float phase_difr = fabsf(fr_phase - sr_phase);
1284  float magl_sum = fl_mag + sl_mag;
1285  float magr_sum = fr_mag + sr_mag;
1286  float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, sl_mag) : (fl_mag - sl_mag) / magl_sum;
1287  float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, sr_mag) : (fr_mag - sr_mag) / magr_sum;
1288  float mag_totall = hypotf(fl_mag, sl_mag);
1289  float mag_totalr = hypotf(fr_mag, sr_mag);
1290  float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re);
1291  float br_phase = atan2f(fr_im + sr_im, fr_re + sr_re);
1292  float xl, yl;
1293  float xr, yr;
1294 
1295  if (phase_difl > M_PI)
1296  phase_difl = 2 * M_PI - phase_difl;
1297 
1298  if (phase_difr > M_PI)
1299  phase_difr = 2 * M_PI - phase_difr;
1300 
1301  stereo_position(mag_difl, phase_difl, &xl, &yl);
1302  stereo_position(mag_difr, phase_difr, &xr, &yr);
1303 
1304  s->upmix_5_1(ctx, c_re, c_im, lfe_re, lfe_im,
1305  mag_totall, mag_totalr,
1306  fl_phase, fr_phase,
1307  bl_phase, br_phase,
1308  sl_phase, sr_phase,
1309  xl, yl, xr, yr, n);
1310  }
1311 }
1312 
1314 {
1315  AudioSurroundContext *s = ctx->priv;
1316  float *srcl, *srcr, *srcc, *srclfe, *srcbl, *srcbr;
1317  int n;
1318 
1319  srcl = (float *)s->input->extended_data[0];
1320  srcr = (float *)s->input->extended_data[1];
1321  srcc = (float *)s->input->extended_data[2];
1322  srclfe = (float *)s->input->extended_data[3];
1323  srcbl = (float *)s->input->extended_data[4];
1324  srcbr = (float *)s->input->extended_data[5];
1325 
1326  for (n = 0; n < s->buf_size; n++) {
1327  float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1328  float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1329  float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
1330  float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];
1331  float bl_re = srcbl[2 * n], bl_im = srcbl[2 * n + 1];
1332  float br_re = srcbr[2 * n], br_im = srcbr[2 * n + 1];
1333  float fl_mag = hypotf(fl_re, fl_im);
1334  float fr_mag = hypotf(fr_re, fr_im);
1335  float fl_phase = atan2f(fl_im, fl_re);
1336  float fr_phase = atan2f(fr_im, fr_re);
1337  float bl_mag = hypotf(bl_re, bl_im);
1338  float br_mag = hypotf(br_re, br_im);
1339  float bl_phase = atan2f(bl_im, bl_re);
1340  float br_phase = atan2f(br_im, br_re);
1341  float phase_difl = fabsf(fl_phase - bl_phase);
1342  float phase_difr = fabsf(fr_phase - br_phase);
1343  float magl_sum = fl_mag + bl_mag;
1344  float magr_sum = fr_mag + br_mag;
1345  float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, bl_mag) : (fl_mag - bl_mag) / magl_sum;
1346  float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, br_mag) : (fr_mag - br_mag) / magr_sum;
1347  float mag_totall = hypotf(fl_mag, bl_mag);
1348  float mag_totalr = hypotf(fr_mag, br_mag);
1349  float sl_phase = atan2f(fl_im + bl_im, fl_re + bl_re);
1350  float sr_phase = atan2f(fr_im + br_im, fr_re + br_re);
1351  float xl, yl;
1352  float xr, yr;
1353 
1354  if (phase_difl > M_PI)
1355  phase_difl = 2 * M_PI - phase_difl;
1356 
1357  if (phase_difr > M_PI)
1358  phase_difr = 2 * M_PI - phase_difr;
1359 
1360  stereo_position(mag_difl, phase_difl, &xl, &yl);
1361  stereo_position(mag_difr, phase_difr, &xr, &yr);
1362 
1363  s->upmix_5_1(ctx, c_re, c_im, lfe_re, lfe_im,
1364  mag_totall, mag_totalr,
1365  fl_phase, fr_phase,
1366  bl_phase, br_phase,
1367  sl_phase, sr_phase,
1368  xl, yl, xr, yr, n);
1369  }
1370 }
1371 
1373 {
1374  AudioSurroundContext *s = ctx->priv;
1375  float overlap;
1376  int i;
1377 
1378  if (!(s->out_channel_layout = av_get_channel_layout(s->out_channel_layout_str))) {
1379  av_log(ctx, AV_LOG_ERROR, "Error parsing output channel layout '%s'.\n",
1380  s->out_channel_layout_str);
1381  return AVERROR(EINVAL);
1382  }
1383 
1384  if (!(s->in_channel_layout = av_get_channel_layout(s->in_channel_layout_str))) {
1385  av_log(ctx, AV_LOG_ERROR, "Error parsing input channel layout '%s'.\n",
1386  s->in_channel_layout_str);
1387  return AVERROR(EINVAL);
1388  }
1389 
1390  if (s->lowcutf >= s->highcutf) {
1391  av_log(ctx, AV_LOG_ERROR, "Low cut-off '%d' should be less than high cut-off '%d'.\n",
1392  s->lowcutf, s->highcutf);
1393  return AVERROR(EINVAL);
1394  }
1395 
1396  switch (s->in_channel_layout) {
1397  case AV_CH_LAYOUT_STEREO:
1398  s->filter = filter_stereo;
1399  switch (s->out_channel_layout) {
1400  case AV_CH_LAYOUT_MONO:
1401  s->upmix_stereo = upmix_1_0;
1402  break;
1403  case AV_CH_LAYOUT_STEREO:
1404  s->upmix_stereo = upmix_stereo;
1405  break;
1406  case AV_CH_LAYOUT_2POINT1:
1407  s->upmix_stereo = upmix_2_1;
1408  break;
1409  case AV_CH_LAYOUT_SURROUND:
1410  s->upmix_stereo = upmix_3_0;
1411  break;
1412  case AV_CH_LAYOUT_3POINT1:
1413  s->upmix_stereo = upmix_3_1;
1414  break;
1415  case AV_CH_LAYOUT_4POINT0:
1416  s->upmix_stereo = upmix_4_0;
1417  break;
1418  case AV_CH_LAYOUT_4POINT1:
1419  s->upmix_stereo = upmix_4_1;
1420  break;
1422  s->upmix_stereo = upmix_5_0_back;
1423  break;
1425  s->upmix_stereo = upmix_5_1_back;
1426  break;
1427  case AV_CH_LAYOUT_6POINT0:
1428  s->upmix_stereo = upmix_6_0;
1429  break;
1430  case AV_CH_LAYOUT_6POINT1:
1431  s->upmix_stereo = upmix_6_1;
1432  break;
1433  case AV_CH_LAYOUT_7POINT0:
1434  s->upmix_stereo = upmix_7_0;
1435  break;
1436  case AV_CH_LAYOUT_7POINT1:
1437  s->upmix_stereo = upmix_7_1;
1438  break;
1439  default:
1440  goto fail;
1441  }
1442  break;
1443  case AV_CH_LAYOUT_2POINT1:
1444  s->filter = filter_2_1;
1445  switch (s->out_channel_layout) {
1447  s->upmix_2_1 = upmix_5_1_back_2_1;
1448  break;
1449  default:
1450  goto fail;
1451  }
1452  break;
1453  case AV_CH_LAYOUT_SURROUND:
1454  s->filter = filter_surround;
1455  switch (s->out_channel_layout) {
1456  case AV_CH_LAYOUT_3POINT1:
1457  s->upmix_3_0 = upmix_3_1_surround;
1458  break;
1460  s->upmix_3_0 = upmix_5_1_back_surround;
1461  break;
1462  default:
1463  goto fail;
1464  }
1465  break;
1466  case AV_CH_LAYOUT_5POINT0:
1467  s->filter = filter_5_0_side;
1468  switch (s->out_channel_layout) {
1469  case AV_CH_LAYOUT_7POINT1:
1470  s->upmix_5_0 = upmix_7_1_5_0_side;
1471  break;
1472  default:
1473  goto fail;
1474  }
1475  break;
1476  case AV_CH_LAYOUT_5POINT1:
1477  s->filter = filter_5_1_side;
1478  switch (s->out_channel_layout) {
1479  case AV_CH_LAYOUT_7POINT1:
1480  s->upmix_5_1 = upmix_7_1_5_1;
1481  break;
1482  default:
1483  goto fail;
1484  }
1485  break;
1487  s->filter = filter_5_1_back;
1488  switch (s->out_channel_layout) {
1489  case AV_CH_LAYOUT_7POINT1:
1490  s->upmix_5_1 = upmix_7_1_5_1;
1491  break;
1492  default:
1493  goto fail;
1494  }
1495  break;
1496  default:
1497 fail:
1498  av_log(ctx, AV_LOG_ERROR, "Unsupported upmix: '%s' -> '%s'.\n",
1499  s->in_channel_layout_str, s->out_channel_layout_str);
1500  return AVERROR(EINVAL);
1501  }
1502 
1503  s->buf_size = 1 << av_log2(s->win_size);
1504  s->pts = AV_NOPTS_VALUE;
1505 
1506  s->window_func_lut = av_calloc(s->buf_size, sizeof(*s->window_func_lut));
1507  if (!s->window_func_lut)
1508  return AVERROR(ENOMEM);
1509 
1510  generate_window_func(s->window_func_lut, s->buf_size, s->win_func, &overlap);
1511  if (s->overlap == 1)
1512  s->overlap = overlap;
1513 
1514  for (i = 0; i < s->buf_size; i++)
1515  s->window_func_lut[i] = sqrtf(s->window_func_lut[i] / s->buf_size);
1516  s->hop_size = s->buf_size * (1. - s->overlap);
1517  if (s->hop_size <= 0)
1518  return AVERROR(EINVAL);
1519 
1520  if (s->all_x >= 0.f)
1521  s->fc_x = s->fl_x = s->fr_x = s->bc_x = s->sl_x = s->sr_x = s->bl_x = s->br_x = s->all_x;
1522  if (s->all_y >= 0.f)
1523  s->fc_y = s->fl_y = s->fr_y = s->bc_y = s->sl_y = s->sr_y = s->bl_y = s->br_y = s->all_y;
1524 
1525  return 0;
1526 }
1527 
1528 static int fft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
1529 {
1530  AudioSurroundContext *s = ctx->priv;
1531  const float level_in = s->input_levels[ch];
1532  float *dst;
1533  int n;
1534 
1535  memset(s->input->extended_data[ch] + s->buf_size * sizeof(float), 0, s->buf_size * sizeof(float));
1536 
1537  dst = (float *)s->input->extended_data[ch];
1538  for (n = 0; n < s->buf_size; n++) {
1539  dst[n] *= s->window_func_lut[n] * level_in;
1540  }
1541 
1542  av_rdft_calc(s->rdft[ch], (float *)s->input->extended_data[ch]);
1543 
1544  return 0;
1545 }
1546 
1547 static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
1548 {
1549  AudioSurroundContext *s = ctx->priv;
1550  const float level_out = s->output_levels[ch];
1551  AVFrame *out = arg;
1552  float *dst, *ptr;
1553  int n;
1554 
1555  av_rdft_calc(s->irdft[ch], (float *)s->output->extended_data[ch]);
1556 
1557  dst = (float *)s->output->extended_data[ch];
1558  ptr = (float *)s->overlap_buffer->extended_data[ch];
1559 
1560  memmove(s->overlap_buffer->extended_data[ch],
1561  s->overlap_buffer->extended_data[ch] + s->hop_size * sizeof(float),
1562  s->buf_size * sizeof(float));
1563  memset(s->overlap_buffer->extended_data[ch] + s->buf_size * sizeof(float),
1564  0, s->hop_size * sizeof(float));
1565 
1566  for (n = 0; n < s->buf_size; n++) {
1567  ptr[n] += dst[n] * s->window_func_lut[n] * level_out;
1568  }
1569 
1570  ptr = (float *)s->overlap_buffer->extended_data[ch];
1571  dst = (float *)out->extended_data[ch];
1572  memcpy(dst, ptr, s->hop_size * sizeof(float));
1573 
1574  return 0;
1575 }
1576 
1578 {
1579  AVFilterContext *ctx = inlink->dst;
1580  AVFilterLink *outlink = ctx->outputs[0];
1581  AudioSurroundContext *s = ctx->priv;
1582  AVFrame *out;
1583  int ret;
1584 
1585  ret = av_audio_fifo_peek(s->fifo, (void **)s->input->extended_data, s->buf_size);
1586  if (ret < 0)
1587  return ret;
1588 
1590 
1591  s->filter(ctx);
1592 
1593  out = ff_get_audio_buffer(outlink, s->hop_size);
1594  if (!out)
1595  return AVERROR(ENOMEM);
1596 
1598 
1599  out->pts = s->pts;
1600  if (s->pts != AV_NOPTS_VALUE)
1601  s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
1602  av_audio_fifo_drain(s->fifo, FFMIN(av_audio_fifo_size(s->fifo), s->hop_size));
1603 
1604  return ff_filter_frame(outlink, out);
1605 }
1606 
1608 {
1609  AVFilterLink *inlink = ctx->inputs[0];
1610  AVFilterLink *outlink = ctx->outputs[0];
1611  AudioSurroundContext *s = ctx->priv;
1612  AVFrame *in = NULL;
1613  int ret = 0, status;
1614  int64_t pts;
1615 
1617 
1618  if (!s->eof && av_audio_fifo_size(s->fifo) < s->buf_size) {
1620  if (ret < 0)
1621  return ret;
1622 
1623  if (ret > 0) {
1624  ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
1625  in->nb_samples);
1626  if (ret >= 0 && s->pts == AV_NOPTS_VALUE)
1627  s->pts = in->pts;
1628 
1629  av_frame_free(&in);
1630  if (ret < 0)
1631  return ret;
1632  }
1633  }
1634 
1635  if ((av_audio_fifo_size(s->fifo) >= s->buf_size) ||
1636  (av_audio_fifo_size(s->fifo) > 0 && s->eof)) {
1637  ret = filter_frame(inlink);
1638  if (av_audio_fifo_size(s->fifo) >= s->buf_size)
1639  ff_filter_set_ready(ctx, 100);
1640  return ret;
1641  }
1642 
1643  if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
1644  if (status == AVERROR_EOF) {
1645  s->eof = 1;
1646  if (av_audio_fifo_size(s->fifo) >= 0) {
1647  ff_filter_set_ready(ctx, 100);
1648  return 0;
1649  }
1650  }
1651  }
1652 
1653  if (s->eof && av_audio_fifo_size(s->fifo) <= 0) {
1654  ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
1655  return 0;
1656  }
1657 
1658  if (!s->eof)
1659  FF_FILTER_FORWARD_WANTED(outlink, inlink);
1660 
1661  return FFERROR_NOT_READY;
1662 }
1663 
1665 {
1666  AudioSurroundContext *s = ctx->priv;
1667  int ch;
1668 
1669  av_frame_free(&s->input);
1670  av_frame_free(&s->output);
1671  av_frame_free(&s->overlap_buffer);
1672 
1673  for (ch = 0; ch < s->nb_in_channels; ch++) {
1674  av_rdft_end(s->rdft[ch]);
1675  }
1676  for (ch = 0; ch < s->nb_out_channels; ch++) {
1677  av_rdft_end(s->irdft[ch]);
1678  }
1679  av_freep(&s->input_levels);
1680  av_freep(&s->output_levels);
1681  av_freep(&s->rdft);
1682  av_freep(&s->irdft);
1683  av_audio_fifo_free(s->fifo);
1684  av_freep(&s->window_func_lut);
1685 }
1686 
1687 #define OFFSET(x) offsetof(AudioSurroundContext, x)
1688 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
1689 
1690 static const AVOption surround_options[] = {
1691  { "chl_out", "set output channel layout", OFFSET(out_channel_layout_str), AV_OPT_TYPE_STRING, {.str="5.1"}, 0, 0, FLAGS },
1692  { "chl_in", "set input channel layout", OFFSET(in_channel_layout_str), AV_OPT_TYPE_STRING, {.str="stereo"},0, 0, FLAGS },
1693  { "level_in", "set input level", OFFSET(level_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1694  { "level_out", "set output level", OFFSET(level_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1695  { "lfe", "output LFE", OFFSET(output_lfe), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
1696  { "lfe_low", "LFE low cut off", OFFSET(lowcutf), AV_OPT_TYPE_INT, {.i64=128}, 0, 256, FLAGS },
1697  { "lfe_high", "LFE high cut off", OFFSET(highcutf), AV_OPT_TYPE_INT, {.i64=256}, 0, 512, FLAGS },
1698  { "lfe_mode", "set LFE channel mode", OFFSET(lfe_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "lfe_mode" },
1699  { "add", "just add LFE channel", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 1, FLAGS, "lfe_mode" },
1700  { "sub", "substract LFE channel with others", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 1, FLAGS, "lfe_mode" },
1701  { "angle", "set soundfield transform angle", OFFSET(angle), AV_OPT_TYPE_FLOAT, {.dbl=90}, 0, 360, FLAGS },
1702  { "fc_in", "set front center channel input level", OFFSET(fc_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1703  { "fc_out", "set front center channel output level", OFFSET(fc_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1704  { "fl_in", "set front left channel input level", OFFSET(fl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1705  { "fl_out", "set front left channel output level", OFFSET(fl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1706  { "fr_in", "set front right channel input level", OFFSET(fr_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1707  { "fr_out", "set front right channel output level", OFFSET(fr_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1708  { "sl_in", "set side left channel input level", OFFSET(sl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1709  { "sl_out", "set side left channel output level", OFFSET(sl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1710  { "sr_in", "set side right channel input level", OFFSET(sr_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1711  { "sr_out", "set side right channel output level", OFFSET(sr_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1712  { "bl_in", "set back left channel input level", OFFSET(bl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1713  { "bl_out", "set back left channel output level", OFFSET(bl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1714  { "br_in", "set back right channel input level", OFFSET(br_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1715  { "br_out", "set back right channel output level", OFFSET(br_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1716  { "bc_in", "set back center channel input level", OFFSET(bc_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1717  { "bc_out", "set back center channel output level", OFFSET(bc_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1718  { "lfe_in", "set lfe channel input level", OFFSET(lfe_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1719  { "lfe_out", "set lfe channel output level", OFFSET(lfe_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, FLAGS },
1720  { "allx", "set all channel's x spread", OFFSET(all_x), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, FLAGS },
1721  { "ally", "set all channel's y spread", OFFSET(all_y), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, FLAGS },
1722  { "fcx", "set front center channel x spread", OFFSET(fc_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1723  { "flx", "set front left channel x spread", OFFSET(fl_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1724  { "frx", "set front right channel x spread", OFFSET(fr_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1725  { "blx", "set back left channel x spread", OFFSET(bl_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1726  { "brx", "set back right channel x spread", OFFSET(br_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1727  { "slx", "set side left channel x spread", OFFSET(sl_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1728  { "srx", "set side right channel x spread", OFFSET(sr_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1729  { "bcx", "set back center channel x spread", OFFSET(bc_x), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1730  { "fcy", "set front center channel y spread", OFFSET(fc_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1731  { "fly", "set front left channel y spread", OFFSET(fl_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1732  { "fry", "set front right channel y spread", OFFSET(fr_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1733  { "bly", "set back left channel y spread", OFFSET(bl_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1734  { "bry", "set back right channel y spread", OFFSET(br_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1735  { "sly", "set side left channel y spread", OFFSET(sl_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1736  { "sry", "set side right channel y spread", OFFSET(sr_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1737  { "bcy", "set back center channel y spread", OFFSET(bc_y), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 15, FLAGS },
1738  { "win_size", "set window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64 = 4096}, 1024, 65536, FLAGS },
1739  WIN_FUNC_OPTION("win_func", OFFSET(win_func), FLAGS, WFUNC_HANNING),
1740  { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1, FLAGS },
1741  { NULL }
1742 };
1743 
1744 AVFILTER_DEFINE_CLASS(surround);
1745 
1746 static const AVFilterPad inputs[] = {
1747  {
1748  .name = "default",
1749  .type = AVMEDIA_TYPE_AUDIO,
1750  .config_props = config_input,
1751  },
1752 };
1753 
1754 static const AVFilterPad outputs[] = {
1755  {
1756  .name = "default",
1757  .type = AVMEDIA_TYPE_AUDIO,
1758  .config_props = config_output,
1759  },
1760 };
1761 
1763  .name = "surround",
1764  .description = NULL_IF_CONFIG_SMALL("Apply audio surround upmix filter."),
1765  .priv_size = sizeof(AudioSurroundContext),
1766  .priv_class = &surround_class,
1767  .init = init,
1768  .uninit = uninit,
1769  .activate = activate,
1773  .flags = AVFILTER_FLAG_SLICE_THREADS,
1774 };
AV_CH_LAYOUT_7POINT0
#define AV_CH_LAYOUT_7POINT0
Definition: channel_layout.h:110
av_audio_fifo_free
void av_audio_fifo_free(AVAudioFifo *af)
Free an AVAudioFifo.
Definition: audio_fifo.c:45
formats
formats
Definition: signature.h:48
AudioSurroundContext::irdft
RDFTContext ** irdft
Definition: af_surround.c:107
ff_get_audio_buffer
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition: audio.c:88
AudioSurroundContext::upmix_5_1
void(* upmix_5_1)(AVFilterContext *ctx, float c_re, float c_im, float lfe_re, float lfe_im, float mag_totall, float mag_totalr, float fl_phase, float fr_phase, float bl_phase, float br_phase, float sl_phase, float sr_phase, float xl, float yl, float xr, float yr, int n)
Definition: af_surround.c:147
upmix_4_0
static void upmix_4_0(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:527
AV_CH_LAYOUT_6POINT1
#define AV_CH_LAYOUT_6POINT1
Definition: channel_layout.h:107
upmix_7_1_5_1
static void upmix_7_1_5_1(AVFilterContext *ctx, float c_re, float c_im, float lfe_re, float lfe_im, float mag_totall, float mag_totalr, float fl_phase, float fr_phase, float bl_phase, float br_phase, float sl_phase, float sr_phase, float xl, float yl, float xr, float yr, int n)
Definition: af_surround.c:1037
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:69
AVFilterChannelLayouts
A list of supported channel layouts.
Definition: formats.h:85
status
they must not be accessed directly The fifo field contains the frames that are queued in the input for processing by the filter The status_in and status_out fields contains the queued status(EOF or error) of the link
AV_CH_LAYOUT_5POINT0_BACK
#define AV_CH_LAYOUT_5POINT0_BACK
Definition: channel_layout.h:102
r
const char * r
Definition: vf_curves.c:116
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AudioSurroundContext::highcutf
int highcutf
Definition: af_surround.c:90
opt.h
AudioSurroundContext
Definition: af_surround.c:33
AudioSurroundContext::fl_x
float fl_x
Definition: af_surround.c:69
AudioSurroundContext::fr_y
float fr_y
Definition: af_surround.c:79
out
FILE * out
Definition: movenc.c:54
AudioSurroundContext::upmix_2_1
void(* upmix_2_1)(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float lfe_im, float lfe_re, float x, float y, int n)
Definition: af_surround.c:121
AudioSurroundContext::br_x
float br_x
Definition: af_surround.c:72
AudioSurroundContext::sr_y
float sr_y
Definition: af_surround.c:83
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1018
ff_channel_layouts_ref
int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
Add *ref as a new reference to f.
Definition: formats.c:550
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:434
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
FFERROR_NOT_READY
return FFERROR_NOT_READY
Definition: filter_design.txt:204
AudioSurroundContext::input
AVFrame * input
Definition: af_surround.c:100
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:90
atan2f
#define atan2f(y, x)
Definition: libm.h:45
AudioSurroundContext::bl_in
float bl_in
Definition: af_surround.c:51
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
OFFSET
#define OFFSET(x)
Definition: af_surround.c:1687
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:109
AudioSurroundContext::sl_y
float sl_y
Definition: af_surround.c:82
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:317
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:424
AudioSurroundContext::hop_size
int hop_size
Definition: af_surround.c:105
AudioSurroundContext::sl_x
float sl_x
Definition: af_surround.c:73
AudioSurroundContext::output_levels
float * output_levels
Definition: af_surround.c:87
M_PI_2
#define M_PI_2
Definition: mathematics.h:55
AudioSurroundContext::nb_out_channels
int nb_out_channels
Definition: af_surround.c:98
AVOption
AVOption.
Definition: opt.h:247
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:168
ff_set_common_all_samplerates
int ff_set_common_all_samplerates(AVFilterContext *ctx)
Equivalent to ff_set_common_samplerates(ctx, ff_all_samplerates())
Definition: formats.c:689
WIN_FUNC_OPTION
#define WIN_FUNC_OPTION(win_func_opt_name, win_func_offset, flag, default_window_func)
Definition: window_func.h:36
av_get_channel_layout
uint64_t av_get_channel_layout(const char *name)
Return a channel layout id that matches name, or 0 if no match is found.
Definition: channel_layout.c:145
AudioSurroundContext::upmix_3_0
void(* upmix_3_0)(AVFilterContext *ctx, float l_phase, float r_phase, float c_mag, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:130
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:169
AudioSurroundContext::overlap
float overlap
Definition: af_surround.c:63
AudioSurroundContext::fc_y
float fc_y
Definition: af_surround.c:77
upmix_2_1
static void upmix_2_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:398
FF_FILTER_FORWARD_STATUS_BACK
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
Definition: filters.h:199
AudioSurroundContext::lfe_mode
int lfe_mode
Definition: af_surround.c:59
AudioSurroundContext::fc_in
float fc_in
Definition: af_surround.c:41
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:64
formats.h
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_surround.c:1664
AudioSurroundContext::output_lfe
int output_lfe
Definition: af_surround.c:88
AV_CH_LAYOUT_6POINT0
#define AV_CH_LAYOUT_6POINT0
Definition: channel_layout.h:104
filter_frame
static int filter_frame(AVFilterLink *inlink)
Definition: af_surround.c:1577
ff_inlink_consume_frame
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Definition: avfilter.c:1417
upmix_6_0
static void upmix_6_0(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:685
AVAudioFifo
Context for an Audio FIFO Buffer.
Definition: audio_fifo.c:34
upmix_5_0_back
static void upmix_5_0_back(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:601
cosf
#define cosf(x)
Definition: libm.h:78
av_audio_fifo_drain
int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples)
Drain data from an AVAudioFifo.
Definition: audio_fifo.c:201
fail
#define fail()
Definition: checkasm.h:127
AudioSurroundContext::all_y
float all_y
Definition: af_surround.c:66
AV_CH_BACK_LEFT
#define AV_CH_BACK_LEFT
Definition: channel_layout.h:53
IDFT_C2R
@ IDFT_C2R
Definition: avfft.h:73
AudioSurroundContext::sr_out
float sr_out
Definition: af_surround.c:50
AudioSurroundContext::level_in
float level_in
Definition: af_surround.c:39
pts
static int64_t pts
Definition: transcode_aac.c:653
fabsf
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:91
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:50
FFDIFFSIGN
#define FFDIFFSIGN(x, y)
Comparator.
Definition: macros.h:45
FLAGS
#define FLAGS
Definition: af_surround.c:1688
AudioSurroundContext::pts
int64_t pts
Definition: af_surround.c:110
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
ff_set_common_formats
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:699
AV_CH_LOW_FREQUENCY
#define AV_CH_LOW_FREQUENCY
Definition: channel_layout.h:52
filter_5_1_back
static void filter_5_1_back(AVFilterContext *ctx)
Definition: af_surround.c:1313
ff_outlink_set_status
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition: filters.h:189
ff_add_channel_layout
int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout)
Definition: formats.c:426
upmix_5_1_back
static void upmix_5_1_back(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:640
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: af_surround.c:159
s
#define s(width, name)
Definition: cbs_vp9.c:257
ff_af_surround
const AVFilter ff_af_surround
Definition: af_surround.c:1762
av_audio_fifo_write
int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples)
Write data to an AVAudioFifo.
Definition: audio_fifo.c:112
AudioSurroundContext::fr_in
float fr_in
Definition: af_surround.c:45
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AudioSurroundContext::br_in
float br_in
Definition: af_surround.c:53
surround_options
static const AVOption surround_options[]
Definition: af_surround.c:1690
outputs
static const AVFilterPad outputs[]
Definition: af_surround.c:1754
AudioSurroundContext::buf_size
int buf_size
Definition: af_surround.c:104
upmix_3_1_surround
static void upmix_3_1_surround(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float c_mag, float mag_total, float x, float y, int n)
Definition: af_surround.c:492
upmix_7_1
static void upmix_7_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:921
filters.h
ctx
AVFormatContext * ctx
Definition: movenc.c:48
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:141
AudioSurroundContext::overlap_buffer
AVFrame * overlap_buffer
Definition: af_surround.c:102
AudioSurroundContext::fr_x
float fr_x
Definition: af_surround.c:70
f
#define f(width, name)
Definition: cbs_vp9.c:255
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:191
av_rdft_calc
void av_rdft_calc(RDFTContext *s, FFTSample *data)
AudioSurroundContext::upmix_5_0
void(* upmix_5_0)(AVFilterContext *ctx, float c_re, float c_im, float mag_totall, float mag_totalr, float fl_phase, float fr_phase, float bl_phase, float br_phase, float sl_phase, float sr_phase, float xl, float yl, float xr, float yr, int n)
Definition: af_surround.c:138
AudioSurroundContext::in_channel_layout
uint64_t in_channel_layout
Definition: af_surround.c:96
arg
const char * arg
Definition: jacosubdec.c:67
AudioSurroundContext::br_y
float br_y
Definition: af_surround.c:81
AudioSurroundContext::lowcutf
int lowcutf
Definition: af_surround.c:89
AudioSurroundContext::bc_in
float bc_in
Definition: af_surround.c:55
AudioSurroundContext::level_out
float level_out
Definition: af_surround.c:40
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AudioSurroundContext::sr_x
float sr_x
Definition: af_surround.c:74
filter_stereo
static void filter_stereo(AVFilterContext *ctx)
Definition: af_surround.c:1093
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_audio_fifo_alloc
AVAudioFifo * av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, int nb_samples)
Allocate an AVAudioFifo.
Definition: audio_fifo.c:59
av_clipf
#define av_clipf
Definition: common.h:144
AudioSurroundContext::filter
void(* filter)(AVFilterContext *ctx)
Definition: af_surround.c:113
AudioSurroundContext::fifo
AVAudioFifo * fifo
Definition: af_surround.c:106
ff_add_format
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition: formats.c:420
filter_5_0_side
static void filter_5_0_side(AVFilterContext *ctx)
Definition: af_surround.c:1197
AV_CH_LAYOUT_5POINT1
#define AV_CH_LAYOUT_5POINT1
Definition: channel_layout.h:101
AudioSurroundContext::lowcut
float lowcut
Definition: af_surround.c:92
ff_log2
#define ff_log2
Definition: intmath.h:50
DFT_R2C
@ DFT_R2C
Definition: avfft.h:72
generate_window_func
static void generate_window_func(float *lut, int N, int win_func, float *overlap)
Definition: window_func.h:60
AudioSurroundContext::fc_x
float fc_x
Definition: af_surround.c:68
avfft.h
WFUNC_HANNING
@ WFUNC_HANNING
Definition: window_func.h:28
AudioSurroundContext::input_levels
float * input_levels
Definition: af_surround.c:86
sinf
#define sinf(x)
Definition: libm.h:419
AudioSurroundContext::nb_in_channels
int nb_in_channels
Definition: af_surround.c:97
stereo_transform
static void stereo_transform(float *x, float *y, float angle)
Definition: af_surround.c:314
fft_channel
static int fft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
Definition: af_surround.c:1528
AV_CH_FRONT_CENTER
#define AV_CH_FRONT_CENTER
Definition: channel_layout.h:51
ifft_channel
static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
Definition: af_surround.c:1547
ff_inlink_acknowledge_status
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
Definition: avfilter.c:1371
AudioSurroundContext::bl_out
float bl_out
Definition: af_surround.c:52
for
for(j=16;j >0;--j)
Definition: h264pred_template.c:469
upmix_4_1
static void upmix_4_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:561
AudioSurroundContext::eof
int eof
Definition: af_surround.c:111
av_rdft_init
RDFTContext * av_rdft_init(int nbits, enum RDFTransformType trans)
Set up a real FFT.
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
powf
#define powf(x, y)
Definition: libm.h:50
AudioSurroundContext::out_channel_layout_str
char * out_channel_layout_str
Definition: af_surround.c:36
activate
static int activate(AVFilterContext *ctx)
Definition: af_surround.c:1607
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AudioSurroundContext::fl_out
float fl_out
Definition: af_surround.c:44
AudioSurroundContext::sl_out
float sl_out
Definition: af_surround.c:48
AudioSurroundContext::in_channel_layout_str
char * in_channel_layout_str
Definition: af_surround.c:37
AudioSurroundContext::lfe_out
float lfe_out
Definition: af_surround.c:58
AudioSurroundContext::fc_out
float fc_out
Definition: af_surround.c:42
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AV_CH_LAYOUT_5POINT1_BACK
#define AV_CH_LAYOUT_5POINT1_BACK
Definition: channel_layout.h:103
FF_FILTER_FORWARD_WANTED
FF_FILTER_FORWARD_WANTED(outlink, inlink)
AudioSurroundContext::sl_in
float sl_in
Definition: af_surround.c:47
av_audio_fifo_size
int av_audio_fifo_size(AVAudioFifo *af)
Get the current number of samples in the AVAudioFifo available for reading.
Definition: audio_fifo.c:228
M_PI
#define M_PI
Definition: mathematics.h:52
AV_CH_LAYOUT_3POINT1
#define AV_CH_LAYOUT_3POINT1
Definition: channel_layout.h:95
AudioSurroundContext::out_channel_layout
uint64_t out_channel_layout
Definition: af_surround.c:95
config_output
static int config_output(AVFilterLink *outlink)
Definition: af_surround.c:257
internal.h
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:227
AudioSurroundContext::bc_y
float bc_y
Definition: af_surround.c:84
AV_CH_LAYOUT_5POINT0
#define AV_CH_LAYOUT_5POINT0
Definition: channel_layout.h:100
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
AudioSurroundContext::br_out
float br_out
Definition: af_surround.c:54
AVFrame::nb_samples
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:397
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(surround)
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
upmix_5_1_back_2_1
static void upmix_5_1_back_2_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float lfe_re, float lfe_im, float x, float y, int n)
Definition: af_surround.c:825
AV_CH_LAYOUT_2POINT1
#define AV_CH_LAYOUT_2POINT1
Definition: channel_layout.h:92
AudioSurroundContext::fl_y
float fl_y
Definition: af_surround.c:78
AVFrame::extended_data
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:378
upmix_7_0
static void upmix_7_0(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:871
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
RDFTContext
Definition: rdft.h:28
filter_5_1_side
static void filter_5_1_side(AVFilterContext *ctx)
Definition: af_surround.c:1254
av_get_channel_layout_channel_index
int av_get_channel_layout_channel_index(uint64_t channel_layout, uint64_t channel)
Get the index of a channel in channel_layout.
Definition: channel_layout.c:239
AV_CH_LAYOUT_7POINT1
#define AV_CH_LAYOUT_7POINT1
Definition: channel_layout.h:112
AV_CH_LAYOUT_4POINT1
#define AV_CH_LAYOUT_4POINT1
Definition: channel_layout.h:97
AV_CH_BACK_CENTER
#define AV_CH_BACK_CENTER
Definition: channel_layout.h:57
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_CH_FRONT_LEFT
#define AV_CH_FRONT_LEFT
Definition: channel_layout.h:49
audio_fifo.h
AV_CH_SIDE_RIGHT
#define AV_CH_SIDE_RIGHT
Definition: channel_layout.h:59
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:56
upmix_3_0
static void upmix_3_0(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:428
filter_surround
static void filter_surround(AVFilterContext *ctx)
Definition: af_surround.c:1126
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:271
AudioSurroundContext::win_size
int win_size
Definition: af_surround.c:61
upmix_stereo
static void upmix_stereo(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:374
AVFilter
Filter definition.
Definition: avfilter.h:165
AudioSurroundContext::output
AVFrame * output
Definition: af_surround.c:101
ret
ret
Definition: filter_design.txt:187
AudioSurroundContext::angle
float angle
Definition: af_surround.c:60
AV_CH_LAYOUT_SURROUND
#define AV_CH_LAYOUT_SURROUND
Definition: channel_layout.h:94
AudioSurroundContext::fl_in
float fl_in
Definition: af_surround.c:43
config_input
static int config_input(AVFilterLink *inlink)
Definition: af_surround.c:194
AudioSurroundContext::rdft
RDFTContext ** rdft
Definition: af_surround.c:107
AudioSurroundContext::win_func
int win_func
Definition: af_surround.c:62
window_func.h
AudioSurroundContext::window_func_lut
float * window_func_lut
Definition: af_surround.c:108
AudioSurroundContext::upmix_stereo
void(* upmix_stereo)(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:114
channel_layout.h
upmix_7_1_5_0_side
static void upmix_7_1_5_0_side(AVFilterContext *ctx, float c_re, float c_im, float mag_totall, float mag_totalr, float fl_phase, float fr_phase, float bl_phase, float br_phase, float sl_phase, float sr_phase, float xl, float yl, float xr, float yr, int n)
Definition: af_surround.c:977
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
avfilter.h
AudioSurroundContext::bc_x
float bc_x
Definition: af_surround.c:75
get_lfe
static void get_lfe(int output_lfe, int n, float lowcut, float highcut, float *lfe_mag, float *mag_total, int lfe_mode)
Definition: af_surround.c:342
upmix_3_1
static void upmix_3_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:457
AVFilterContext
An instance of a filter.
Definition: avfilter.h:402
AV_CH_FRONT_RIGHT
#define AV_CH_FRONT_RIGHT
Definition: channel_layout.h:50
upmix_1_0
static void upmix_1_0(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:355
AudioSurroundContext::sr_in
float sr_in
Definition: af_surround.c:49
AVFILTER_FLAG_SLICE_THREADS
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition: avfilter.h:121
upmix_5_1_back_surround
static void upmix_5_1_back_surround(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float c_mag, float mag_total, float x, float y, int n)
Definition: af_surround.c:779
audio.h
M_LN10
#define M_LN10
Definition: mathematics.h:43
AudioSurroundContext::highcut
float highcut
Definition: af_surround.c:93
AudioSurroundContext::lfe_in
float lfe_in
Definition: af_surround.c:57
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:192
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AudioSurroundContext::bc_out
float bc_out
Definition: af_surround.c:56
AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_4POINT0
Definition: channel_layout.h:96
av_rdft_end
void av_rdft_end(RDFTContext *s)
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AV_CH_BACK_RIGHT
#define AV_CH_BACK_RIGHT
Definition: channel_layout.h:54
init
static av_cold int init(AVFilterContext *ctx)
Definition: af_surround.c:1372
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
AudioSurroundContext::fr_out
float fr_out
Definition: af_surround.c:46
ff_filter_execute
static av_always_inline int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: internal.h:143
upmix_6_1
static void upmix_6_1(AVFilterContext *ctx, float l_phase, float r_phase, float c_phase, float mag_total, float x, float y, int n)
Definition: af_surround.c:729
av_audio_fifo_peek
int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples)
Peek data from an AVAudioFifo.
Definition: audio_fifo.c:138
AudioSurroundContext::bl_y
float bl_y
Definition: af_surround.c:80
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:233
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AudioSurroundContext::bl_x
float bl_x
Definition: af_surround.c:71
stereo_position
static void stereo_position(float a, float p, float *x, float *y)
Definition: af_surround.c:334
filter_2_1
static void filter_2_1(AVFilterContext *ctx)
Definition: af_surround.c:1162
AV_CH_SIDE_LEFT
#define AV_CH_SIDE_LEFT
Definition: channel_layout.h:58
AudioSurroundContext::all_x
float all_x
Definition: af_surround.c:65
ff_filter_set_ready
void ff_filter_set_ready(AVFilterContext *filter, unsigned priority)
Mark a filter ready and schedule it for activation.
Definition: avfilter.c:211
inputs
static const AVFilterPad inputs[]
Definition: af_surround.c:1746