From multiplication with magnitude.
Unified · Split
| @@ -96,9 +96,12 @@ typedef struct AudioSurroundContext { · 95 unmodified lines | ||
| 96 | 96 | int nb_in_channels; |
| 97 | 97 | int nb_out_channels; |
| 98 | 98 | |
| 99 | + AVFrame *factors; | |
| 99 | 100 | AVFrame *input_in; |
| 100 | 101 | AVFrame *input; |
| 101 | 102 | AVFrame *output; |
| 103 | + AVFrame *output_mag; | |
| 104 | + AVFrame *output_ph; | |
| 102 | 105 | AVFrame *output_out; |
| 103 | 106 | AVFrame *overlap_buffer; |
| 104 | 107 | AVFrame *window; |
| @@ -293,10 +296,14 @@ static int config_output(AVFilterLink *outlink) · 188 unmodified lines | ||
| 293 | 296 | |
| 294 | 297 | set_output_levels(ctx); |
| 295 | 298 | |
| 299 | + s->factors = ff_get_audio_buffer(outlink, s->win_size + 2); | |
| 300 | + s->output_ph = ff_get_audio_buffer(outlink, s->win_size + 2); | |
| 301 | + s->output_mag = ff_get_audio_buffer(outlink, s->win_size + 2); | |
| 296 | 302 | s->output_out = ff_get_audio_buffer(outlink, s->win_size + 2); |
| 297 | 303 | s->output = ff_get_audio_buffer(outlink, s->win_size + 2); |
| 298 | 304 | s->overlap_buffer = ff_get_audio_buffer(outlink, s->win_size * 2); |
| 299 | − if (!s->overlap_buffer || !s->output || !s->output_out) | |
| 305 | + if (!s->overlap_buffer || !s->output || !s->output_out || !s->output_mag || | |
| 306 | + !s->output_ph || !s->factors) | |
| 300 | 307 | return AVERROR(ENOMEM); |
| 301 | 308 | |
| 302 | 309 | s->rdft_size = s->win_size / 2 + 1; |
| @@ -397,6 +404,9 @@ static int stereo_upmix(AVFilterContext *ctx, int ch) · 94 unmodified lines | ||
| 397 | 404 | { |
| 398 | 405 | AudioSurroundContext *s = ctx->priv; |
| 399 | 406 | float *dst = (float *)s->output->extended_data[ch]; |
| 407 | + float *factor = (float *)s->factors->extended_data[ch]; | |
| 408 | + float *omag = (float *)s->output_mag->extended_data[ch]; | |
| 409 | + float *oph = (float *)s->output_ph->extended_data[ch]; | |
| 400 | 410 | const float *mag_total = s->mag_total; |
| 401 | 411 | const int rdft_size = s->rdft_size; |
| 402 | 412 | const float *c_phase = s->c_phase; |
| @@ -412,81 +422,95 @@ static int stereo_upmix(AVFilterContext *ctx, int ch) · 9 unmodified lines | ||
| 412 | 422 | |
| 413 | 423 | switch (chan) { |
| 414 | 424 | case AV_CHAN_FRONT_CENTER: |
| 415 | − for (int n = 0; n < rdft_size; n++) { | |
| 416 | − float mag = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y) * c_mag[n]; | |
| 417 | − float ph = c_phase[n]; | |
| 418 | − | |
| 419 | − TRANSFORM | |
| 420 | − } | |
| 425 | + for (int n = 0; n < rdft_size; n++) | |
| 426 | + factor[n] = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y); | |
| 421 | 427 | break; |
| 422 | 428 | case AV_CHAN_FRONT_LEFT: |
| 423 | − for (int n = 0; n < rdft_size; n++) { | |
| 424 | − float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n]; | |
| 425 | − float ph = l_phase[n]; | |
| 426 | − | |
| 427 | − TRANSFORM | |
| 428 | − } | |
| 429 | + for (int n = 0; n < rdft_size; n++) | |
| 430 | + factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y); | |
| 429 | 431 | break; |
| 430 | 432 | case AV_CHAN_FRONT_RIGHT: |
| 431 | − for (int n = 0; n < rdft_size; n++) { | |
| 432 | − float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n]; | |
| 433 | − float ph = r_phase[n]; | |
| 434 | − | |
| 435 | − TRANSFORM | |
| 436 | − } | |
| 433 | + for (int n = 0; n < rdft_size; n++) | |
| 434 | + factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf((y[n] + 1.f) * .5f, f_y); | |
| 437 | 435 | break; |
| 438 | 436 | case AV_CHAN_LOW_FREQUENCY: |
| 439 | − for (int n = 0; n < rdft_size; n++) { | |
| 440 | − float mag = lfe_mag[n]; | |
| 441 | − float ph = c_phase[n]; | |
| 442 | − | |
| 443 | − TRANSFORM | |
| 444 | − } | |
| 437 | + for (int n = 0; n < rdft_size; n++) | |
| 438 | + factor[n] = lfe_mag[n]; | |
| 445 | 439 | break; |
| 446 | 440 | case AV_CHAN_BACK_CENTER: |
| 447 | − for (int n = 0; n < rdft_size; n++) { | |
| 448 | − float mag = powf(1.f - fabsf(x[n]), f_x) * powf((1.f - y[n]) * .5f, f_y) * mag_total[n]; | |
| 449 | − float ph = c_phase[n]; | |
| 450 | − | |
| 451 | − TRANSFORM | |
| 452 | − } | |
| 441 | + for (int n = 0; n < rdft_size; n++) | |
| 442 | + factor[n] = powf(1.f - fabsf(x[n]), f_x) * powf((1.f - y[n]) * .5f, f_y); | |
| 453 | 443 | break; |
| 454 | 444 | case AV_CHAN_BACK_LEFT: |
| 455 | − for (int n = 0; n < rdft_size; n++) { | |
| 456 | − float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n]; | |
| 457 | − float ph = l_phase[n]; | |
| 458 | − | |
| 459 | − TRANSFORM | |
| 460 | − } | |
| 445 | + for (int n = 0; n < rdft_size; n++) | |
| 446 | + factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y); | |
| 461 | 447 | break; |
| 462 | 448 | case AV_CHAN_BACK_RIGHT: |
| 463 | − for (int n = 0; n < rdft_size; n++) { | |
| 464 | − float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y) * mag_total[n]; | |
| 465 | − float ph = r_phase[n]; | |
| 466 | − | |
| 467 | − TRANSFORM | |
| 468 | − } | |
| 449 | + for (int n = 0; n < rdft_size; n++) | |
| 450 | + factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - ((y[n] + 1.f) * .5f), f_y); | |
| 469 | 451 | break; |
| 470 | 452 | case AV_CHAN_SIDE_LEFT: |
| 471 | − for (int n = 0; n < rdft_size; n++) { | |
| 472 | − float mag = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n]; | |
| 473 | − float ph = l_phase[n]; | |
| 453 | + for (int n = 0; n < rdft_size; n++) | |
| 454 | + factor[n] = powf(.5f * ( x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y); | |
| 455 | + break; | |
| 456 | + case AV_CHAN_SIDE_RIGHT: | |
| 457 | + for (int n = 0; n < rdft_size; n++) | |
| 458 | + factor[n] = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y); | |
| 459 | + break; | |
| 460 | + default: | |
| 461 | + break; | |
| 462 | + } | |
| 474 | 463 | |
| 475 | − TRANSFORM | |
| 476 | − } | |
| 464 | + switch (chan) { | |
| 465 | + case AV_CHAN_FRONT_CENTER: | |
| 466 | + memcpy(omag, c_mag, rdft_size * sizeof(*omag)); | |
| 477 | 467 | break; |
| 468 | + case AV_CHAN_LOW_FREQUENCY: | |
| 469 | + memcpy(omag, lfe_mag, rdft_size * sizeof(*omag)); | |
| 470 | + break; | |
| 471 | + case AV_CHAN_FRONT_LEFT: | |
| 472 | + case AV_CHAN_FRONT_RIGHT: | |
| 473 | + case AV_CHAN_BACK_CENTER: | |
| 474 | + case AV_CHAN_BACK_LEFT: | |
| 475 | + case AV_CHAN_BACK_RIGHT: | |
| 476 | + case AV_CHAN_SIDE_LEFT: | |
| 478 | 477 | case AV_CHAN_SIDE_RIGHT: |
| 479 | − for (int n = 0; n < rdft_size; n++) { | |
| 480 | − float mag = powf(.5f * (-x[n] + 1.f), f_x) * powf(1.f - fabsf(y[n]), f_y) * mag_total[n]; | |
| 481 | − float ph = r_phase[n]; | |
| 478 | + memcpy(omag, mag_total, rdft_size * sizeof(*omag)); | |
| 479 | + break; | |
| 480 | + default: | |
| 481 | + break; | |
| 482 | + } | |
| 482 | 483 | |
| 483 | − TRANSFORM | |
| 484 | − } | |
| 484 | + switch (chan) { | |
| 485 | + case AV_CHAN_FRONT_CENTER: | |
| 486 | + case AV_CHAN_LOW_FREQUENCY: | |
| 487 | + case AV_CHAN_BACK_CENTER: | |
| 488 | + memcpy(oph, c_phase, rdft_size * sizeof(*oph)); | |
| 489 | + break; | |
| 490 | + case AV_CHAN_FRONT_LEFT: | |
| 491 | + case AV_CHAN_BACK_LEFT: | |
| 492 | + case AV_CHAN_SIDE_LEFT: | |
| 493 | + memcpy(oph, l_phase, rdft_size * sizeof(*oph)); | |
| 494 | + break; | |
| 495 | + case AV_CHAN_FRONT_RIGHT: | |
| 496 | + case AV_CHAN_BACK_RIGHT: | |
| 497 | + case AV_CHAN_SIDE_RIGHT: | |
| 498 | + memcpy(oph, r_phase, rdft_size * sizeof(*oph)); | |
| 485 | 499 | break; |
| 486 | 500 | default: |
| 487 | 501 | break; |
| 488 | 502 | } |
| 489 | 503 | |
| 504 | + for (int n = 0; n < rdft_size; n++) | |
| 505 | + omag[n] *= factor[n]; | |
| 506 | + | |
| 507 | + for (int n = 0; n < rdft_size; n++) { | |
| 508 | + const float mag = omag[n]; | |
| 509 | + const float ph = oph[n]; | |
| 510 | + | |
| 511 | + TRANSFORM | |
| 512 | + } | |
| 513 | + | |
| 490 | 514 | return 0; |
| 491 | 515 | } |
| 492 | 516 | |
| @@ -1329,10 +1353,13 @@ static av_cold void uninit(AVFilterContext *ctx) · 836 unmodified lines | ||
| 1329 | 1353 | { |
| 1330 | 1354 | AudioSurroundContext *s = ctx->priv; |
| 1331 | 1355 | |
| 1356 | + av_frame_free(&s->factors); | |
| 1332 | 1357 | av_frame_free(&s->window); |
| 1333 | 1358 | av_frame_free(&s->input_in); |
| 1334 | 1359 | av_frame_free(&s->input); |
| 1335 | 1360 | av_frame_free(&s->output); |
| 1361 | + av_frame_free(&s->output_ph); | |
| 1362 | + av_frame_free(&s->output_mag); | |
| 1336 | 1363 | av_frame_free(&s->output_out); |
| 1337 | 1364 | av_frame_free(&s->overlap_buffer); |
| 1338 | 1365 | |