aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-11-18 00:04:53 +0100
committerPaul B Mahol <onemda@gmail.com>2022-11-18 00:53:51 +0100
commit00409d81d9a4174023a7edadfb51b19606ec1d27 (patch)
tree5133f17bc0081722ec7f3e9699131cb8eb9bc46d /libavfilter
parent1c6fd7d756afe0f8b7df14dbf7a95df275f8f5ee (diff)
downloadffmpeg-00409d81d9a4174023a7edadfb51b19606ec1d27.tar.gz
avfilter/af_surround: simplify some code more
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/af_surround.c292
1 files changed, 116 insertions, 176 deletions
diff --git a/libavfilter/af_surround.c b/libavfilter/af_surround.c
index d38a2a236e..9a589645ca 100644
--- a/libavfilter/af_surround.c
+++ b/libavfilter/af_surround.c
@@ -29,6 +29,35 @@
#include "formats.h"
#include "window_func.h"
+enum SurroundChannel {
+ SC_FL, SC_FR, SC_FC, SC_LF, SC_BL, SC_BR, SC_BC, SC_SL, SC_SR,
+ SC_NB,
+};
+
+static const int ch_map[SC_NB] = {
+ [SC_FL] = AV_CHAN_FRONT_LEFT,
+ [SC_FR] = AV_CHAN_FRONT_RIGHT,
+ [SC_FC] = AV_CHAN_FRONT_CENTER,
+ [SC_LF] = AV_CHAN_LOW_FREQUENCY,
+ [SC_BL] = AV_CHAN_BACK_LEFT,
+ [SC_BR] = AV_CHAN_BACK_RIGHT,
+ [SC_BC] = AV_CHAN_BACK_CENTER,
+ [SC_SL] = AV_CHAN_SIDE_LEFT,
+ [SC_SR] = AV_CHAN_SIDE_RIGHT,
+};
+
+static const int sc_map[16] = {
+ [AV_CHAN_FRONT_LEFT ] = SC_FL,
+ [AV_CHAN_FRONT_RIGHT ] = SC_FR,
+ [AV_CHAN_FRONT_CENTER ] = SC_FC,
+ [AV_CHAN_LOW_FREQUENCY] = SC_LF,
+ [AV_CHAN_BACK_LEFT ] = SC_BL,
+ [AV_CHAN_BACK_RIGHT ] = SC_BR,
+ [AV_CHAN_BACK_CENTER ] = SC_BC,
+ [AV_CHAN_SIDE_LEFT ] = SC_SL,
+ [AV_CHAN_SIDE_RIGHT ] = SC_SR,
+};
+
typedef struct AudioSurroundContext {
const AVClass *class;
@@ -37,24 +66,8 @@ typedef struct AudioSurroundContext {
float level_in;
float level_out;
- float fc_in;
- float fc_out;
- float fl_in;
- float fl_out;
- float fr_in;
- float fr_out;
- float sl_in;
- float sl_out;
- float sr_in;
- float sr_out;
- float bl_in;
- float bl_out;
- float br_in;
- float br_out;
- float bc_in;
- float bc_out;
- float lfe_in;
- float lfe_out;
+ float f_i[SC_NB];
+ float f_o[SC_NB];
int lfe_mode;
float angle;
float focus;
@@ -65,23 +78,8 @@ typedef struct AudioSurroundContext {
float all_x;
float all_y;
- float fc_x;
- float fl_x;
- float fr_x;
- float bl_x;
- float br_x;
- float sl_x;
- float sr_x;
- float bc_x;
-
- float fc_y;
- float fl_y;
- float fr_y;
- float bl_y;
- float br_y;
- float sl_y;
- float sr_y;
- float bc_y;
+ float f_x[SC_NB];
+ float f_y[SC_NB];
float *input_levels;
float *output_levels;
@@ -197,37 +195,14 @@ static int query_formats(AVFilterContext *ctx)
static void set_input_levels(AVFilterContext *ctx)
{
AudioSurroundContext *s = ctx->priv;
- int ch;
-
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_FRONT_CENTER);
- if (ch >= 0)
- s->input_levels[ch] = s->fc_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_FRONT_LEFT);
- if (ch >= 0)
- s->input_levels[ch] = s->fl_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_FRONT_RIGHT);
- if (ch >= 0)
- s->input_levels[ch] = s->fr_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_SIDE_LEFT);
- if (ch >= 0)
- s->input_levels[ch] = s->sl_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_SIDE_RIGHT);
- if (ch >= 0)
- s->input_levels[ch] = s->sr_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_BACK_LEFT);
- if (ch >= 0)
- s->input_levels[ch] = s->bl_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_BACK_RIGHT);
- if (ch >= 0)
- s->input_levels[ch] = s->br_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_BACK_CENTER);
- if (ch >= 0)
- s->input_levels[ch] = s->bc_in;
- ch = av_channel_layout_index_from_channel(&s->in_ch_layout, AV_CHAN_LOW_FREQUENCY);
- if (ch >= 0)
- s->input_levels[ch] = s->lfe_in;
-
- for (ch = 0; ch < s->nb_in_channels && s->level_in >= 0.f; ch++)
+
+ for (int n = 0; n < SC_NB; n++) {
+ const int ch = av_channel_layout_index_from_channel(&s->in_ch_layout, ch_map[n]);
+ if (ch >= 0)
+ s->input_levels[ch] = s->f_i[n];
+ }
+
+ for (int ch = 0; ch < s->nb_in_channels && s->level_in >= 0.f; ch++)
s->input_levels[ch] = s->level_in;
s->level_in = -1.f;
}
@@ -235,37 +210,14 @@ static void set_input_levels(AVFilterContext *ctx)
static void set_output_levels(AVFilterContext *ctx)
{
AudioSurroundContext *s = ctx->priv;
- int ch;
-
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_FRONT_CENTER);
- if (ch >= 0)
- s->output_levels[ch] = s->fc_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_FRONT_LEFT);
- if (ch >= 0)
- s->output_levels[ch] = s->fl_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_FRONT_RIGHT);
- if (ch >= 0)
- s->output_levels[ch] = s->fr_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_SIDE_LEFT);
- if (ch >= 0)
- s->output_levels[ch] = s->sl_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_SIDE_RIGHT);
- if (ch >= 0)
- s->output_levels[ch] = s->sr_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_BACK_LEFT);
- if (ch >= 0)
- s->output_levels[ch] = s->bl_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_BACK_RIGHT);
- if (ch >= 0)
- s->output_levels[ch] = s->br_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_BACK_CENTER);
- if (ch >= 0)
- s->output_levels[ch] = s->bc_out;
- ch = av_channel_layout_index_from_channel(&s->out_ch_layout, AV_CHAN_LOW_FREQUENCY);
- if (ch >= 0)
- s->output_levels[ch] = s->lfe_out;
-
- for (ch = 0; ch < s->nb_out_channels && s->level_out >= 0.f; ch++)
+
+ for (int n = 0; n < SC_NB; n++) {
+ const int ch = av_channel_layout_index_from_channel(&s->out_ch_layout, ch_map[n]);
+ if (ch >= 0)
+ s->output_levels[ch] = s->f_o[n];
+ }
+
+ for (int ch = 0; ch < s->nb_out_channels && s->level_out >= 0.f; ch++)
s->output_levels[ch] = s->level_out;
s->level_out = -1.f;
}
@@ -289,6 +241,7 @@ static int config_input(AVFilterLink *inlink)
if (ret < 0)
return ret;
}
+
s->input_levels = av_malloc_array(s->nb_in_channels, sizeof(*s->input_levels));
if (!s->input_levels)
return AVERROR(ENOMEM);
@@ -451,12 +404,11 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
const float *x = s->x_pos;
const float *y = s->y_pos;
const int chan = av_channel_layout_channel_from_index(&s->out_ch_layout, ch);
- float f_x, f_y;
+ const float f_x = s->f_x[sc_map[chan]];
+ const float f_y = s->f_y[sc_map[chan]];
switch (chan) {
case AV_CHAN_FRONT_CENTER:
- f_x = s->fc_x;
- f_y = s->fc_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
float ph = c_phase[n];
@@ -465,8 +417,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_FRONT_LEFT:
- f_x = s->fl_x;
- f_y = s->fl_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
float ph = l_phase[n];
@@ -475,8 +425,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_FRONT_RIGHT:
- f_x = s->fr_x;
- f_y = s->fr_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
float ph = r_phase[n];
@@ -493,8 +441,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_BACK_CENTER:
- f_x = s->bc_x;
- f_y = s->bc_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(1.f - fabsf(x[n]), f_x) * powf((1.f - y[n]) * .5f, f_y) * mag_total[n];
float ph = c_phase[n];
@@ -503,8 +449,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_BACK_LEFT:
- f_x = s->bl_x;
- f_y = s->bl_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n];
float ph = l_phase[n];
@@ -513,8 +457,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_BACK_RIGHT:
- f_x = s->br_x;
- f_y = s->br_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n];
float ph = r_phase[n];
@@ -523,8 +465,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_SIDE_LEFT:
- f_x = s->sl_x;
- f_y = s->sl_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n];
float ph = l_phase[n];
@@ -533,8 +473,6 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
}
break;
case AV_CHAN_SIDE_RIGHT:
- f_x = s->sr_x;
- f_y = s->sr_y;
for (int n = 0; n < rdft_size; n++) {
float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n];
float ph = r_phase[n];
@@ -568,8 +506,8 @@ static void upmix_3_1_surround(AVFilterContext *ctx,
get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
- l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
- r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+ l_mag = powf(.5f * ( x + 1.f), s->f_x[SC_FL]) * powf((y + 1.f) * .5f, s->f_y[SC_FL]) * mag_total;
+ r_mag = powf(.5f * (-x + 1.f), s->f_x[SC_FR]) * powf((y + 1.f) * .5f, s->f_y[SC_FR]) * mag_total;
dstl[2 * n ] = l_mag * cosf(l_phase);
dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -606,10 +544,10 @@ static void upmix_5_1_back_surround(AVFilterContext *ctx,
get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
- l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
- r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
- ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
- rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+ l_mag = powf(.5f * ( x + 1.f), s->f_x[SC_FL]) * powf((y + 1.f) * .5f, s->f_y[SC_FL]) * mag_total;
+ r_mag = powf(.5f * (-x + 1.f), s->f_x[SC_FR]) * powf((y + 1.f) * .5f, s->f_y[SC_FR]) * mag_total;
+ ls_mag = powf(.5f * ( x + 1.f), s->f_x[SC_BL]) * powf(1.f - ((y + 1.f) * .5f), s->f_y[SC_BL]) * mag_total;
+ rs_mag = powf(.5f * (-x + 1.f), s->f_x[SC_BR]) * powf(1.f - ((y + 1.f) * .5f), s->f_y[SC_BR]) * mag_total;
dstl[2 * n ] = l_mag * cosf(l_phase);
dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -651,11 +589,11 @@ static void upmix_5_1_back_2_1(AVFilterContext *ctx,
dstls = (float *)s->output->extended_data[4];
dstrs = (float *)s->output->extended_data[5];
- c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
- l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
- r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
- ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
- rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+ c_mag = powf(1.f - fabsf(x), s->f_x[SC_FC]) * powf((y + 1.f) * .5f, s->f_y[SC_FC]) * mag_total;
+ l_mag = powf(.5f * ( x + 1.f), s->f_x[SC_FL]) * powf((y + 1.f) * .5f, s->f_y[SC_FL]) * mag_total;
+ r_mag = powf(.5f * (-x + 1.f), s->f_x[SC_FR]) * powf((y + 1.f) * .5f, s->f_y[SC_FR]) * mag_total;
+ ls_mag = powf(.5f * ( x + 1.f), s->f_x[SC_BL]) * powf(1.f - ((y + 1.f) * .5f), s->f_y[SC_BL]) * mag_total;
+ rs_mag = powf(.5f * (-x + 1.f), s->f_x[SC_BR]) * powf(1.f - ((y + 1.f) * .5f), s->f_y[SC_BR]) * mag_total;
dstl[2 * n ] = l_mag * cosf(l_phase);
dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -704,12 +642,12 @@ static void upmix_7_1_5_0_side(AVFilterContext *ctx,
get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
- fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
- fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
- lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
- rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
- ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
- rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
+ fl_mag = powf(.5f * (xl + 1.f), s->f_x[SC_FL]) * powf((yl + 1.f) * .5f, s->f_y[SC_FL]) * mag_totall;
+ fr_mag = powf(.5f * (xr + 1.f), s->f_x[SC_FR]) * powf((yr + 1.f) * .5f, s->f_y[SC_FR]) * mag_totalr;
+ lb_mag = powf(.5f * (-xl + 1.f), s->f_x[SC_BL]) * powf((yl + 1.f) * .5f, s->f_y[SC_BL]) * mag_totall;
+ rb_mag = powf(.5f * (-xr + 1.f), s->f_x[SC_BR]) * powf((yr + 1.f) * .5f, s->f_y[SC_BR]) * mag_totalr;
+ ls_mag = powf(1.f - fabsf(xl), s->f_x[SC_SL]) * powf((yl + 1.f) * .5f, s->f_y[SC_SL]) * mag_totall;
+ rs_mag = powf(1.f - fabsf(xr), s->f_x[SC_SR]) * powf((yr + 1.f) * .5f, s->f_y[SC_SR]) * mag_totalr;
dstl[2 * n ] = fl_mag * cosf(fl_phase);
dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
@@ -760,12 +698,12 @@ static void upmix_7_1_5_1(AVFilterContext *ctx,
dstls = (float *)s->output->extended_data[6];
dstrs = (float *)s->output->extended_data[7];
- fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
- fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
- lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
- rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
- ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
- rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
+ fl_mag = powf(.5f * (xl + 1.f), s->f_x[SC_FL]) * powf((yl + 1.f) * .5f, s->f_y[SC_FL]) * mag_totall;
+ fr_mag = powf(.5f * (xr + 1.f), s->f_x[SC_FR]) * powf((yr + 1.f) * .5f, s->f_y[SC_FR]) * mag_totalr;
+ lb_mag = powf(.5f * (-xl + 1.f), s->f_x[SC_BL]) * powf((yl + 1.f) * .5f, s->f_y[SC_BL]) * mag_totall;
+ rb_mag = powf(.5f * (-xr + 1.f), s->f_x[SC_BR]) * powf((yr + 1.f) * .5f, s->f_y[SC_BR]) * mag_totalr;
+ ls_mag = powf(1.f - fabsf(xl), s->f_x[SC_SL]) * powf((yl + 1.f) * .5f, s->f_y[SC_SL]) * mag_totall;
+ rs_mag = powf(1.f - fabsf(xr), s->f_x[SC_SR]) * powf((yr + 1.f) * .5f, s->f_y[SC_SR]) * mag_totalr;
dstl[2 * n ] = fl_mag * cosf(fl_phase);
dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
@@ -1096,10 +1034,12 @@ static void allchannels_spread(AVFilterContext *ctx)
AudioSurroundContext *s = ctx->priv;
if (s->all_x >= 0.f)
- 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;
+ for (int n = 0; n < SC_NB; n++)
+ s->f_x[n] = s->all_x;
s->all_x = -1.f;
if (s->all_y >= 0.f)
- 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;
+ for (int n = 0; n < SC_NB; n++)
+ s->f_y[n] = s->all_y;
s->all_y = -1.f;
}
@@ -1445,43 +1385,43 @@ static const AVOption surround_options[] = {
{ "sub", "substract LFE channel with others", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 1, TFLAGS, "lfe_mode" },
{ "angle", "set soundfield transform angle", OFFSET(angle), AV_OPT_TYPE_FLOAT, {.dbl=90}, 0, 360, TFLAGS },
{ "focus", "set soundfield transform focus", OFFSET(focus), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, TFLAGS },
- { "fc_in", "set front center channel input level", OFFSET(fc_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "fc_out", "set front center channel output level", OFFSET(fc_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "fl_in", "set front left channel input level", OFFSET(fl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "fl_out", "set front left channel output level", OFFSET(fl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "fr_in", "set front right channel input level", OFFSET(fr_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "fr_out", "set front right channel output level", OFFSET(fr_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "sl_in", "set side left channel input level", OFFSET(sl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "sl_out", "set side left channel output level", OFFSET(sl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "sr_in", "set side right channel input level", OFFSET(sr_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "sr_out", "set side right channel output level", OFFSET(sr_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "bl_in", "set back left channel input level", OFFSET(bl_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "bl_out", "set back left channel output level", OFFSET(bl_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "br_in", "set back right channel input level", OFFSET(br_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "br_out", "set back right channel output level", OFFSET(br_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "bc_in", "set back center channel input level", OFFSET(bc_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "bc_out", "set back center channel output level", OFFSET(bc_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "lfe_in", "set lfe channel input level", OFFSET(lfe_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "lfe_out", "set lfe channel output level", OFFSET(lfe_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
- { "allx", "set all channel's x spread", OFFSET(all_x), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, TFLAGS },
- { "ally", "set all channel's y spread", OFFSET(all_y), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, TFLAGS },
- { "fcx", "set front center channel x spread", OFFSET(fc_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "flx", "set front left channel x spread", OFFSET(fl_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "frx", "set front right channel x spread", OFFSET(fr_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "blx", "set back left channel x spread", OFFSET(bl_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "brx", "set back right channel x spread", OFFSET(br_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "slx", "set side left channel x spread", OFFSET(sl_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "srx", "set side right channel x spread", OFFSET(sr_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "bcx", "set back center channel x spread", OFFSET(bc_x), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "fcy", "set front center channel y spread", OFFSET(fc_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "fly", "set front left channel y spread", OFFSET(fl_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "fry", "set front right channel y spread", OFFSET(fr_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "bly", "set back left channel y spread", OFFSET(bl_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "bry", "set back right channel y spread", OFFSET(br_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "sly", "set side left channel y spread", OFFSET(sl_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "sry", "set side right channel y spread", OFFSET(sr_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "bcy", "set back center channel y spread", OFFSET(bc_y), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
- { "win_size", "set window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64 = 4096}, 1024, 65536, FLAGS },
+ { "fc_in", "set front center channel input level", OFFSET(f_i[SC_FC]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "fc_out", "set front center channel output level", OFFSET(f_o[SC_FC]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "fl_in", "set front left channel input level", OFFSET(f_i[SC_FL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "fl_out", "set front left channel output level", OFFSET(f_o[SC_FL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "fr_in", "set front right channel input level", OFFSET(f_i[SC_FR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "fr_out", "set front right channel output level", OFFSET(f_o[SC_FR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "sl_in", "set side left channel input level", OFFSET(f_i[SC_SL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "sl_out", "set side left channel output level", OFFSET(f_o[SC_SL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "sr_in", "set side right channel input level", OFFSET(f_i[SC_SR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "sr_out", "set side right channel output level", OFFSET(f_o[SC_SR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "bl_in", "set back left channel input level", OFFSET(f_i[SC_BL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "bl_out", "set back left channel output level", OFFSET(f_o[SC_BL]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "br_in", "set back right channel input level", OFFSET(f_i[SC_BR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "br_out", "set back right channel output level", OFFSET(f_o[SC_BR]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "bc_in", "set back center channel input level", OFFSET(f_i[SC_BC]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "bc_out", "set back center channel output level", OFFSET(f_o[SC_BC]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "lfe_in", "set lfe channel input level", OFFSET(f_i[SC_LF]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "lfe_out", "set lfe channel output level", OFFSET(f_o[SC_LF]), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
+ { "allx", "set all channel's x spread", OFFSET(all_x), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, TFLAGS },
+ { "ally", "set all channel's y spread", OFFSET(all_y), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 15, TFLAGS },
+ { "fcx", "set front center channel x spread", OFFSET(f_x[SC_FC]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "flx", "set front left channel x spread", OFFSET(f_x[SC_FL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "frx", "set front right channel x spread", OFFSET(f_x[SC_FR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "blx", "set back left channel x spread", OFFSET(f_x[SC_BL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "brx", "set back right channel x spread", OFFSET(f_x[SC_BR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "slx", "set side left channel x spread", OFFSET(f_x[SC_SL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "srx", "set side right channel x spread", OFFSET(f_x[SC_SR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "bcx", "set back center channel x spread", OFFSET(f_x[SC_BC]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "fcy", "set front center channel y spread", OFFSET(f_y[SC_FC]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "fly", "set front left channel y spread", OFFSET(f_y[SC_FL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "fry", "set front right channel y spread", OFFSET(f_y[SC_FR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "bly", "set back left channel y spread", OFFSET(f_y[SC_BL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "bry", "set back right channel y spread", OFFSET(f_y[SC_BR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "sly", "set side left channel y spread", OFFSET(f_y[SC_SL]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "sry", "set side right channel y spread", OFFSET(f_y[SC_SR]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "bcy", "set back center channel y spread", OFFSET(f_y[SC_BC]), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, .06, 15, TFLAGS },
+ { "win_size", "set window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64=4096},1024,65536,FLAGS },
WIN_FUNC_OPTION("win_func", OFFSET(win_func), FLAGS, WFUNC_HANNING),
{ "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1, TFLAGS },
{ NULL }