101 const int coffset = coeff_partition * seg->coeff_size;
102 const int nb_taps =
s->nb_taps[selir];
103 ftype *time = (
ftype *)
s->norm_ir[selir]->extended_data[ch];
104 ftype *tempin = (
ftype *)seg->tempin->extended_data[ch];
105 ftype *tempout = (
ftype *)seg->tempout->extended_data[ch];
107 const int remaining = nb_taps - (seg->input_offset + coeff_partition * seg->part_size);
108 const int size = remaining >= seg->part_size ? seg->part_size : remaining;
110 memset(tempin +
size, 0,
sizeof(*tempin) * (seg->block_size -
size));
111 memcpy(tempin, time + seg->input_offset + coeff_partition * seg->part_size,
112 size *
sizeof(*tempin));
113 seg->ctx_fn(seg->ctx[ch], tempout, tempin,
sizeof(*tempin));
114 memcpy(
coeff + coffset, tempout, seg->coeff_size *
sizeof(*
coeff));
143 const ftype *in = (
const ftype *)
s->in->extended_data[ch] + ioffset;
145 const int min_part_size =
s->min_part_size;
146 const int nb_samples =
FFMIN(min_part_size,
s->in->nb_samples - ioffset);
147 const int nb_segments =
s->nb_segments[selir];
148 const float dry_gain =
s->dry_gain;
149 const float wet_gain =
s->wet_gain;
166 if (dry_gain == 1.f) {
167 memcpy(
src + input_offset, in, nb_samples *
sizeof(*
src));
168 }
else if (min_part_size >= 8) {
170 s->fdsp->vector_fmul_scalar(
src + input_offset, in, dry_gain,
FFALIGN(nb_samples, 4));
172 s->fdsp->vector_dmul_scalar(
src + input_offset, in, dry_gain,
FFALIGN(nb_samples, 8));
176 for (
int n = 0; n < nb_samples; n++)
177 src2[n] = in[n] * dry_gain;
180 output_offset[0] += min_part_size;
181 if (output_offset[0] >= part_size) {
182 output_offset[0] = 0;
186 dst += output_offset[0];
191 memset(sumin, 0,
sizeof(*sumin) * seg->
fft_length);
194 memset(tempin + part_size, 0,
sizeof(*tempin) * (seg->
block_size - part_size));
195 memcpy(tempin,
src,
sizeof(*
src) * part_size);
196 seg->
tx_fn(seg->
tx[ch], blockout, tempin,
sizeof(
ftype));
199 for (
int i = 0;
i < nb_partitions;
i++) {
200 const int input_partition = j;
201 const int coeff_partition =
i;
202 const int coffset = coeff_partition * seg->
coeff_size;
211 s->afirdsp.fcmul_add(sumin, blockout, (
const ftype *)
coeff, part_size);
213 s->afirdsp.dcmul_add(sumin, blockout, (
const ftype *)
coeff, part_size);
220 memcpy(
dst, buf, part_size *
sizeof(*
dst));
221 memcpy(buf, sumout + part_size, part_size *
sizeof(*buf));
225 if (part_size != min_part_size)
234 if (min_part_size >= 8) {
236 s->fdsp->vector_fmul_scalar(ptr, ptr, wet_gain,
FFALIGN(nb_samples, 4));
238 s->fdsp->vector_dmul_scalar(ptr, ptr, wet_gain,
FFALIGN(nb_samples, 8));
241 for (
int n = 0; n < nb_samples; n++)
249 int min_part_size,
int ch,
int offset,
250 int prev_selir,
int selir)
252 const int nb_samples =
FFMIN(min_part_size,
s->in->nb_samples -
offset);
254 if (
ctx->is_disabled ||
s->prev_is_disabled) {
256 const ftype *xfade0 = (
const ftype *)
s->xfade[0]->extended_data[ch];
257 const ftype *xfade1 = (
const ftype *)
s->xfade[1]->extended_data[ch];
262 if (
ctx->is_disabled && !
s->prev_is_disabled) {
263 memset(
src0, 0, min_part_size *
sizeof(
ftype));
265 for (
int n = 0; n < nb_samples; n++)
266 dst[n] = xfade1[n] *
src0[n] + xfade0[n] * in[n];
267 }
else if (!
ctx->is_disabled &&
s->prev_is_disabled) {
268 memset(
src1, 0, min_part_size *
sizeof(
ftype));
270 for (
int n = 0; n < nb_samples; n++)
271 dst[n] = xfade1[n] * in[n] + xfade0[n] *
src1[n];
273 memcpy(
dst, in,
sizeof(
ftype) * nb_samples);
275 }
else if (prev_selir != selir &&
s->loading[ch] != 0) {
276 const ftype *xfade0 = (
const ftype *)
s->xfade[0]->extended_data[ch];
277 const ftype *xfade1 = (
const ftype *)
s->xfade[1]->extended_data[ch];
282 memset(
src0, 0, min_part_size *
sizeof(
ftype));
283 memset(
src1, 0, min_part_size *
sizeof(
ftype));
288 if (
s->loading[ch] >
s->max_offset[selir]) {
289 for (
int n = 0; n < nb_samples; n++)
290 dst[n] = xfade1[n] *
src0[n] + xfade0[n] *
src1[n];
static void fn fir_quantums(AVFilterContext *ctx, AudioFIRContext *s, AVFrame *out, int min_part_size, int ch, int offset, int prev_selir, int selir)
static void fn convert_channel(AVFilterContext *ctx, AudioFIRContext *s, int ch, AudioFIRSegment *seg, int coeff_partition, int selir)
static int fn fir_quantum(AVFilterContext *ctx, AVFrame *out, int ch, int ioffset, int offset, int selir)
static void fn ir_scale(AVFilterContext *ctx, AudioFIRContext *s, int cur_nb_taps, int ch, ftype *time, ftype ch_gain)