out[n] += ir[m].re * in[n - m];
}
+static void fir_fadd(AudioFIRContext *s, float *dst, const float *src, int nb_samples)
+{
+ if ((nb_samples & 15) == 0 && nb_samples >= 16) {
+ s->fdsp->vector_fmac_scalar(dst, src, 1.f, nb_samples);
+ } else {
+ for (int n = 0; n < nb_samples; n++)
+ dst[n] += src[n];
+ }
+}
+
static int fir_quantum(AVFilterContext *ctx, AVFrame *out, int ch, int offset)
{
AudioFIRContext *s = ctx->priv;
memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
dst += seg->output_offset[ch];
- for (n = 0; n < nb_samples; n++) {
- ptr[n] += dst[n];
- }
+ fir_fadd(s, ptr, dst, nb_samples);
continue;
}
av_rdft_calc(seg->irdft[ch], sum);
buf = (float *)seg->buffer->extended_data[ch];
- for (n = 0; n < seg->part_size; n++) {
- buf[n] += sum[n];
- }
+ fir_fadd(s, buf, sum, seg->part_size);
memcpy(dst, buf, seg->part_size * sizeof(*dst));
memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
- for (n = 0; n < nb_samples; n++) {
- ptr[n] += dst[n];
- }
+ fir_fadd(s, ptr, dst, nb_samples);
}
if (s->min_part_size >= 8) {
return 0;
}
-static int check_ir(AVFilterLink *link, AVFrame *frame)
+static int check_ir(AVFilterLink *link)
{
AVFilterContext *ctx = link->dst;
AudioFIRContext *s = ctx->priv;
if (s->response)
FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[1], ctx);
if (!s->eof_coeffs[s->selir]) {
- AVFrame *ir = NULL;
-
- ret = check_ir(ctx->inputs[1 + s->selir], ir);
+ ret = check_ir(ctx->inputs[1 + s->selir]);
if (ret < 0)
return ret;
if (s->response) {
AVFilterLink *videolink = ctx->outputs[1];
formats = ff_make_format_list(pix_fmts);
- if ((ret = ff_formats_ref(formats, &videolink->in_formats)) < 0)
+ if ((ret = ff_formats_ref(formats, &videolink->incfg.formats)) < 0)
return ret;
}
} else {
AVFilterChannelLayouts *mono = NULL;
- if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[0]->out_channel_layouts)) < 0)
+ if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[0]->outcfg.channel_layouts)) < 0)
return ret;
- if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->in_channel_layouts)) < 0)
+ if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->incfg.channel_layouts)) < 0)
return ret;
ret = ff_add_channel_layout(&mono, AV_CH_LAYOUT_MONO);
if (ret)
return ret;
for (int i = 1; i < ctx->nb_inputs; i++) {
- if ((ret = ff_channel_layouts_ref(mono, &ctx->inputs[i]->out_channel_layouts)) < 0)
+ if ((ret = ff_channel_layouts_ref(mono, &ctx->inputs[i]->outcfg.channel_layouts)) < 0)
return ret;
}
}
av_frame_free(&s->ir[i]);
}
- for (int i = 0; i < ctx->nb_inputs; i++)
+ for (unsigned i = 1; i < ctx->nb_inputs; i++)
av_freep(&ctx->input_pads[i].name);
- for (int i = 0; i < ctx->nb_outputs; i++)
- av_freep(&ctx->output_pads[i].name);
av_frame_free(&s->video);
}
int ret;
pad = (AVFilterPad) {
- .name = av_strdup("main"),
+ .name = "main",
.type = AVMEDIA_TYPE_AUDIO,
};
- if (!pad.name)
- return AVERROR(ENOMEM);
-
ret = ff_insert_inpad(ctx, 0, &pad);
- if (ret < 0) {
- av_freep(&pad.name);
+ if (ret < 0)
return ret;
- }
for (int n = 0; n < s->nb_irs; n++) {
pad = (AVFilterPad) {
}
pad = (AVFilterPad) {
- .name = av_strdup("default"),
+ .name = "default",
.type = AVMEDIA_TYPE_AUDIO,
.config_props = config_output,
};
- if (!pad.name)
- return AVERROR(ENOMEM);
-
ret = ff_insert_outpad(ctx, 0, &pad);
- if (ret < 0) {
- av_freep(&pad.name);
+ if (ret < 0)
return ret;
- }
if (s->response) {
vpad = (AVFilterPad){
- .name = av_strdup("filter_response"),
+ .name = "filter_response",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = config_video,
};
- if (!vpad.name)
- return AVERROR(ENOMEM);
ret = ff_insert_outpad(ctx, 1, &vpad);
- if (ret < 0) {
- av_freep(&vpad.name);
+ if (ret < 0)
return ret;
- }
}
s->fdsp = avpriv_float_dsp_alloc(0);
AVFILTER_DEFINE_CLASS(afir);
-AVFilter ff_af_afir = {
+const AVFilter ff_af_afir = {
.name = "afir",
.description = NULL_IF_CONFIG_SMALL("Apply Finite Impulse Response filter with supplied coefficients in additional stream(s)."),
.priv_size = sizeof(AudioFIRContext),