+static int init_segment(AVFilterContext *ctx, AudioFIRSegment *seg,
+ int offset, int nb_partitions, int part_size)
+{
+ AudioFIRContext *s = ctx->priv;
+
+ seg->rdft = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->rdft));
+ seg->irdft = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->irdft));
+ if (!seg->rdft || !seg->irdft)
+ return AVERROR(ENOMEM);
+
+ seg->fft_length = part_size * 2 + 1;
+ seg->part_size = part_size;
+ seg->block_size = FFALIGN(seg->fft_length, 32);
+ seg->coeff_size = FFALIGN(seg->part_size + 1, 32);
+ seg->nb_partitions = nb_partitions;
+ seg->input_size = offset + s->min_part_size;
+ seg->input_offset = offset;
+
+ seg->part_index = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->part_index));
+ seg->output_offset = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->output_offset));
+ if (!seg->part_index || !seg->output_offset)
+ return AVERROR(ENOMEM);
+
+ for (int ch = 0; ch < ctx->inputs[0]->channels; ch++) {
+ seg->rdft[ch] = av_rdft_init(av_log2(2 * part_size), DFT_R2C);
+ seg->irdft[ch] = av_rdft_init(av_log2(2 * part_size), IDFT_C2R);
+ if (!seg->rdft[ch] || !seg->irdft[ch])
+ return AVERROR(ENOMEM);
+ }
+
+ seg->sum = ff_get_audio_buffer(ctx->inputs[0], seg->fft_length);
+ seg->block = ff_get_audio_buffer(ctx->inputs[0], seg->nb_partitions * seg->block_size);
+ seg->buffer = ff_get_audio_buffer(ctx->inputs[0], seg->part_size);
+ seg->coeff = ff_get_audio_buffer(ctx->inputs[1], seg->nb_partitions * seg->coeff_size * 2);
+ seg->input = ff_get_audio_buffer(ctx->inputs[0], seg->input_size);
+ seg->output = ff_get_audio_buffer(ctx->inputs[0], seg->part_size);
+ if (!seg->buffer || !seg->sum || !seg->block || !seg->coeff || !seg->input || !seg->output)
+ return AVERROR(ENOMEM);
+
+ return 0;
+}
+