|
|
|
@ -162,6 +162,7 @@ typedef struct MixContext { |
|
|
|
|
|
|
|
|
|
int nb_channels; /**< number of channels */ |
|
|
|
|
int sample_rate; /**< sample rate */ |
|
|
|
|
int planar; |
|
|
|
|
AVAudioFifo **fifos; /**< audio fifo for each input */ |
|
|
|
|
uint8_t *input_state; /**< current state of each input */ |
|
|
|
|
float *input_scale; /**< mixing scale factor for each input */ |
|
|
|
@ -225,6 +226,7 @@ static int config_output(AVFilterLink *outlink) |
|
|
|
|
int i; |
|
|
|
|
char buf[64]; |
|
|
|
|
|
|
|
|
|
s->planar = av_sample_fmt_is_planar(outlink->format); |
|
|
|
|
s->sample_rate = outlink->sample_rate; |
|
|
|
|
outlink->time_base = (AVRational){ 1, outlink->sample_rate }; |
|
|
|
|
s->next_pts = AV_NOPTS_VALUE; |
|
|
|
@ -287,12 +289,20 @@ static int output_frame(AVFilterLink *outlink, int nb_samples) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < s->nb_inputs; i++) { |
|
|
|
|
if (s->input_state[i] == INPUT_ON) { |
|
|
|
|
int planes, plane_size, p; |
|
|
|
|
|
|
|
|
|
av_audio_fifo_read(s->fifos[i], (void **)in_buf->extended_data, |
|
|
|
|
nb_samples); |
|
|
|
|
s->fdsp.vector_fmac_scalar((float *)out_buf->extended_data[0], |
|
|
|
|
(float *) in_buf->extended_data[0], |
|
|
|
|
s->input_scale[i], |
|
|
|
|
FFALIGN(nb_samples * s->nb_channels, 16)); |
|
|
|
|
|
|
|
|
|
planes = s->planar ? s->nb_channels : 1; |
|
|
|
|
plane_size = nb_samples * (s->planar ? 1 : s->nb_channels); |
|
|
|
|
plane_size = FFALIGN(plane_size, 16); |
|
|
|
|
|
|
|
|
|
for (p = 0; p < planes; p++) { |
|
|
|
|
s->fdsp.vector_fmac_scalar((float *)out_buf->extended_data[p], |
|
|
|
|
(float *) in_buf->extended_data[p], |
|
|
|
|
s->input_scale[i], plane_size); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
avfilter_unref_buffer(in_buf); |
|
|
|
@ -523,6 +533,7 @@ static int query_formats(AVFilterContext *ctx) |
|
|
|
|
{ |
|
|
|
|
AVFilterFormats *formats = NULL; |
|
|
|
|
ff_add_format(&formats, AV_SAMPLE_FMT_FLT); |
|
|
|
|
ff_add_format(&formats, AV_SAMPLE_FMT_FLTP); |
|
|
|
|
ff_set_common_formats(ctx, formats); |
|
|
|
|
ff_set_common_channel_layouts(ctx, ff_all_channel_layouts()); |
|
|
|
|
ff_set_common_samplerates(ctx, ff_all_samplerates()); |
|
|
|
|