| @@ -601,6 +601,100 @@ static void upmix_5_1_back(AVFilterContext *ctx, | |||
| dstrs[2 * n + 1] = rs_mag * sinf(r_phase); | |||
| } | |||
| 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) | |||
| { | |||
| AudioSurroundContext *s = ctx->priv; | |||
| float l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs; | |||
| dstl = (float *)s->output->extended_data[0]; | |||
| dstr = (float *)s->output->extended_data[1]; | |||
| dstc = (float *)s->output->extended_data[2]; | |||
| dstb = (float *)s->output->extended_data[3]; | |||
| 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; | |||
| b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_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; | |||
| dstl[2 * n ] = l_mag * cosf(l_phase); | |||
| dstl[2 * n + 1] = l_mag * sinf(l_phase); | |||
| dstr[2 * n ] = r_mag * cosf(r_phase); | |||
| dstr[2 * n + 1] = r_mag * sinf(r_phase); | |||
| dstc[2 * n ] = c_mag * cosf(c_phase); | |||
| dstc[2 * n + 1] = c_mag * sinf(c_phase); | |||
| dstls[2 * n ] = ls_mag * cosf(l_phase); | |||
| dstls[2 * n + 1] = ls_mag * sinf(l_phase); | |||
| dstrs[2 * n ] = rs_mag * cosf(r_phase); | |||
| dstrs[2 * n + 1] = rs_mag * sinf(r_phase); | |||
| dstb[2 * n ] = b_mag * cosf(c_phase); | |||
| dstb[2 * n + 1] = b_mag * sinf(c_phase); | |||
| } | |||
| 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) | |||
| { | |||
| AudioSurroundContext *s = ctx->priv; | |||
| float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs, *dstlfe; | |||
| dstl = (float *)s->output->extended_data[0]; | |||
| dstr = (float *)s->output->extended_data[1]; | |||
| dstc = (float *)s->output->extended_data[2]; | |||
| dstlfe = (float *)s->output->extended_data[3]; | |||
| dstb = (float *)s->output->extended_data[4]; | |||
| dstls = (float *)s->output->extended_data[5]; | |||
| dstrs = (float *)s->output->extended_data[6]; | |||
| get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode); | |||
| c_mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total; | |||
| b_mag = powf(1.f - fabsf(x), s->bc_x) * powf((1.f - y) * .5f, s->bc_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; | |||
| dstl[2 * n ] = l_mag * cosf(l_phase); | |||
| dstl[2 * n + 1] = l_mag * sinf(l_phase); | |||
| dstr[2 * n ] = r_mag * cosf(r_phase); | |||
| dstr[2 * n + 1] = r_mag * sinf(r_phase); | |||
| dstc[2 * n ] = c_mag * cosf(c_phase); | |||
| dstc[2 * n + 1] = c_mag * sinf(c_phase); | |||
| dstlfe[2 * n ] = lfe_mag * cosf(c_phase); | |||
| dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase); | |||
| dstls[2 * n ] = ls_mag * cosf(l_phase); | |||
| dstls[2 * n + 1] = ls_mag * sinf(l_phase); | |||
| dstrs[2 * n ] = rs_mag * cosf(r_phase); | |||
| dstrs[2 * n + 1] = rs_mag * sinf(r_phase); | |||
| dstb[2 * n ] = b_mag * cosf(c_phase); | |||
| dstb[2 * n + 1] = b_mag * sinf(c_phase); | |||
| } | |||
| static void upmix_5_1_back_surround(AVFilterContext *ctx, | |||
| float l_phase, | |||
| float r_phase, | |||
| @@ -1246,6 +1340,12 @@ static int init(AVFilterContext *ctx) | |||
| case AV_CH_LAYOUT_5POINT1_BACK: | |||
| s->upmix_stereo = upmix_5_1_back; | |||
| break; | |||
| case AV_CH_LAYOUT_6POINT0: | |||
| s->upmix_stereo = upmix_6_0; | |||
| break; | |||
| case AV_CH_LAYOUT_6POINT1: | |||
| s->upmix_stereo = upmix_6_1; | |||
| break; | |||
| case AV_CH_LAYOUT_7POINT0: | |||
| s->upmix_stereo = upmix_7_0; | |||
| break; | |||