Showing the changes to libavfilter (3 of 3 files). Show all
Unified · Split
| @@ -298,8 +298,6 @@ static int convert_coeffs(AVFilterContext *ctx, int selir) · 297 unmodified lines | |||
| 298 | part_size = 1 << av_log2(s->minp); | 298 | part_size = 1 << av_log2(s->minp); |
| 299 | max_part_size = 1 << av_log2(s->maxp); | 299 | max_part_size = 1 << av_log2(s->maxp); |
| 300 | 300 | ||
| 301 | s->min_part_size = part_size; | ||
| 302 | |||
| 303 | for (int i = 0; left > 0; i++) { | 301 | for (int i = 0; left > 0; i++) { |
| 304 | int step = part_size == max_part_size ? INT_MAX : 1 + (i == 0); | 302 | int step = part_size == max_part_size ? INT_MAX : 1 + (i == 0); |
| 305 | int nb_partitions = FFMIN(step, (left + part_size - 1) / part_size); | 303 | int nb_partitions = FFMIN(step, (left + part_size - 1) / part_size); |
| @@ -592,6 +590,36 @@ FF_ENABLE_DEPRECATION_WARNINGS · 286 unmodified lines | |||
| 592 | if (!s->loading) | 590 | if (!s->loading) |
| 593 | return AVERROR(ENOMEM); | 591 | return AVERROR(ENOMEM); |
| 594 | 592 | ||
| 593 | s->xfade[0] = ff_get_audio_buffer(outlink, s->min_part_size); | ||
| 594 | s->xfade[1] = ff_get_audio_buffer(outlink, s->min_part_size); | ||
| 595 | if (!s->xfade[0] || !s->xfade[1]) | ||
| 596 | return AVERROR(ENOMEM); | ||
| 597 | |||
| 598 | switch (s->format) { | ||
| 599 | case AV_SAMPLE_FMT_FLTP: | ||
| 600 | for (int ch = 0; ch < s->nb_channels; ch++) { | ||
| 601 | float *dst0 = (float *)s->xfade[0]->extended_data[ch]; | ||
| 602 | float *dst1 = (float *)s->xfade[1]->extended_data[ch]; | ||
| 603 | |||
| 604 | for (int n = 0; n < s->min_part_size; n++) { | ||
| 605 | dst0[n] = (n + 1.f) / s->min_part_size; | ||
| 606 | dst1[n] = 1.f - dst0[n]; | ||
| 607 | } | ||
| 608 | } | ||
| 609 | break; | ||
| 610 | case AV_SAMPLE_FMT_DBLP: | ||
| 611 | for (int ch = 0; ch < s->nb_channels; ch++) { | ||
| 612 | double *dst0 = (double *)s->xfade[0]->extended_data[ch]; | ||
| 613 | double *dst1 = (double *)s->xfade[1]->extended_data[ch]; | ||
| 614 | |||
| 615 | for (int n = 0; n < s->min_part_size; n++) { | ||
| 616 | dst0[n] = (n + 1.0) / s->min_part_size; | ||
| 617 | dst1[n] = 1.0 - dst0[n]; | ||
| 618 | } | ||
| 619 | } | ||
| 620 | break; | ||
| 621 | } | ||
| 622 | |||
| 595 | return 0; | 623 | return 0; |
| 596 | } | 624 | } |
| 597 | 625 | ||
| @@ -610,6 +638,9 @@ static av_cold void uninit(AVFilterContext *ctx) · 12 unmodified lines | |||
| 610 | av_frame_free(&s->norm_ir[i]); | 638 | av_frame_free(&s->norm_ir[i]); |
| 611 | } | 639 | } |
| 612 | 640 | ||
| 641 | av_frame_free(&s->xfade[0]); | ||
| 642 | av_frame_free(&s->xfade[1]); | ||
| 643 | |||
| 613 | av_frame_free(&s->video); | 644 | av_frame_free(&s->video); |
| 614 | } | 645 | } |
| 615 | 646 | ||
| @@ -691,6 +722,8 @@ static av_cold int init(AVFilterContext *ctx) · 75 unmodified lines | |||
| 691 | 722 | ||
| 692 | ff_afir_init(&s->afirdsp); | 723 | ff_afir_init(&s->afirdsp); |
| 693 | 724 | ||
| 725 | s->min_part_size = 1 << av_log2(s->minp); | ||
| 726 | |||
| 694 | return 0; | 727 | return 0; |
| 695 | } | 728 | } |
| 696 | 729 | ||
| @@ -90,6 +90,7 @@ typedef struct AudioFIRContext { · 89 unmodified lines | |||
| 90 | AudioFIRSegment seg[MAX_IR_STREAMS][1024]; | 90 | AudioFIRSegment seg[MAX_IR_STREAMS][1024]; |
| 91 | 91 | ||
| 92 | AVFrame *in; | 92 | AVFrame *in; |
| 93 | AVFrame *xfade[2]; | ||
| 93 | AVFrame *ir[MAX_IR_STREAMS]; | 94 | AVFrame *ir[MAX_IR_STREAMS]; |
| 94 | AVFrame *norm_ir[MAX_IR_STREAMS]; | 95 | AVFrame *norm_ir[MAX_IR_STREAMS]; |
| 95 | AVFrame *video; | 96 | AVFrame *video; |
| @@ -292,6 +292,8 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int offse · 291 unmodified lines | |||
| 292 | ftype *blockout, *ptr = (ftype *)out->extended_data[ch] + offset; | 292 | ftype *blockout, *ptr = (ftype *)out->extended_data[ch] + offset; |
| 293 | const int min_part_size = s->min_part_size; | 293 | const int min_part_size = s->min_part_size; |
| 294 | const int nb_samples = FFMIN(min_part_size, out->nb_samples - offset); | 294 | const int nb_samples = FFMIN(min_part_size, out->nb_samples - offset); |
| 295 | const ftype *xfade0 = (const ftype *)s->xfade[0]->extended_data[ch]; | ||
| 296 | const ftype *xfade1 = (const ftype *)s->xfade[1]->extended_data[ch]; | ||
| 295 | const int nb_segments = s->nb_segments[selir]; | 297 | const int nb_segments = s->nb_segments[selir]; |
| 296 | const float dry_gain = s->dry_gain; | 298 | const float dry_gain = s->dry_gain; |
| 297 | 299 | ||
| @@ -370,7 +372,7 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int offse · 72 unmodified lines | |||
| 370 | if (selir == s->selir) { | 372 | if (selir == s->selir) { |
| 371 | if (s->loading[ch] <= min_part_size) { | 373 | if (s->loading[ch] <= min_part_size) { |
| 372 | for (int n = 0; n < nb_samples; n++) | 374 | for (int n = 0; n < nb_samples; n++) |
| 373 | ptr[n] += dst[n] * ((n + 1.f) / nb_samples); | 375 | ptr[n] += dst[n] * xfade0[n]; |
| 374 | } | 376 | } |
| 375 | } else { | 377 | } else { |
| 376 | fn(fir_fadd)(s, ptr, dst, nb_samples); | 378 | fn(fir_fadd)(s, ptr, dst, nb_samples); |
| @@ -388,7 +390,7 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int offse · 11 unmodified lines | |||
| 388 | if (selir != s->selir) { | 390 | if (selir != s->selir) { |
| 389 | if (s->loading[ch] <= min_part_size) { | 391 | if (s->loading[ch] <= min_part_size) { |
| 390 | for (int n = 0; n < nb_samples; n++) | 392 | for (int n = 0; n < nb_samples; n++) |
| 391 | ptr[n] *= (nb_samples - n * 1.f) / nb_samples; | 393 | ptr[n] *= xfade1[n]; |
| 392 | } | 394 | } |
| 393 | return 0; | 395 | return 0; |
| 394 | } | 396 | } |