+ 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));
+
+ for (n = 0; n < nb_samples; n++) {
+ ptr[n] += dst[n];
+ }
+ continue;
+ }
+
+ memset(sum, 0, sizeof(*sum) * seg->fft_length);
+ block = (float *)seg->block->extended_data[ch] + seg->part_index[ch] * seg->block_size;
+ memset(block + seg->part_size, 0, sizeof(*block) * (seg->fft_length - seg->part_size));
+
+ 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);