+ memcpy(block, src, sizeof(*src) * seg->part_size);
+
+ av_rdft_calc(seg->rdft[ch], block);
+ block[2 * seg->part_size] = block[1];
+ block[1] = 0;
+
+ j = seg->part_index[ch];
+
+ for (i = 0; i < seg->nb_partitions; i++) {
+ const int coffset = j * seg->coeff_size;
+ const float *block = (const float *)seg->block->extended_data[ch] + i * seg->block_size;
+ const FFTComplex *coeff = (const FFTComplex *)seg->coeff->extended_data[ch * !s->one2many] + coffset;
+
+ s->afirdsp.fcmul_add(sum, block, (const float *)coeff, seg->part_size);
+
+ if (j == 0)
+ j = seg->nb_partitions;
+ j--;
+ }
+
+ sum[1] = sum[2 * seg->part_size];
+ av_rdft_calc(seg->irdft[ch], sum);
+
+ buf = (float *)seg->buffer->extended_data[ch];
+ fir_fadd(s, buf, sum, seg->part_size);
+
+ memcpy(dst, buf, seg->part_size * sizeof(*dst));
+
+ buf = (float *)seg->buffer->extended_data[ch];
+ memcpy(buf, sum + seg->part_size, seg->part_size * sizeof(*buf));
+
+ seg->part_index[ch] = (seg->part_index[ch] + 1) % seg->nb_partitions;
+
+ memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
+
+ fir_fadd(s, ptr, dst, nb_samples);