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