History

avfilter/af_afir: cache xfade coefficients

Paul B Mahol committed 3 years ago

Commit a0cb2921 parent 0b352e33 files · +40 −4Browse files

Unified · Split

3 files
  1. libavfilter/af_afir.c +35 −2
  2. libavfilter/af_afir.h +1 −0
  3. libavfilter/afir_template.c +4 −2
libavfilter/af_afir.c+35−2
@@ -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
libavfilter/af_afir.h+1−0
@@ -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;
libavfilter/afir_template.c+4−2
@@ -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 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t