Signed-off-by: Paul B Mahol <one...@gmail.com> --- libavfilter/af_amix.c | 19 +++++++++++++++---- libavutil/float_dsp.c | 9 +++++++++ libavutil/float_dsp.h | 16 ++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c index a4d1389..2dacb22 100644 --- a/libavfilter/af_amix.c +++ b/libavfilter/af_amix.c @@ -336,10 +336,19 @@ static int output_frame(AVFilterLink *outlink) 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); + if (out_buf->format == AV_SAMPLE_FMT_FLT || + out_buf->format == AV_SAMPLE_FMT_FLTP) { + 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); + } + } else { + for (p = 0; p < planes; p++) { + s->fdsp->vector_dmac_scalar((double *)out_buf->extended_data[p], + (double *) in_buf->extended_data[p], + s->input_scale[i], plane_size); + } } } } @@ -529,6 +538,8 @@ static int query_formats(AVFilterContext *ctx) if ((ret = ff_add_format(&formats, AV_SAMPLE_FMT_FLT )) < 0 || (ret = ff_add_format(&formats, AV_SAMPLE_FMT_FLTP)) < 0 || + (ret = ff_add_format(&formats, AV_SAMPLE_FMT_DBL )) < 0 || + (ret = ff_add_format(&formats, AV_SAMPLE_FMT_DBLP)) < 0 || (ret = ff_set_common_formats (ctx, formats)) < 0 || (ret = ff_set_common_channel_layouts(ctx, layouts)) < 0 || (ret = ff_set_common_samplerates(ctx, ff_all_samplerates())) < 0) diff --git a/libavutil/float_dsp.c b/libavutil/float_dsp.c index c85daff..1d4911d 100644 --- a/libavutil/float_dsp.c +++ b/libavutil/float_dsp.c @@ -40,6 +40,14 @@ static void vector_fmac_scalar_c(float *dst, const float *src, float mul, dst[i] += src[i] * mul; } +static void vector_dmac_scalar_c(double *dst, const double *src, double mul, + int len) +{ + int i; + for (i = 0; i < len; i++) + dst[i] += src[i] * mul; +} + static void vector_fmul_scalar_c(float *dst, const float *src, float mul, int len) { @@ -125,6 +133,7 @@ av_cold AVFloatDSPContext *avpriv_float_dsp_alloc(int bit_exact) fdsp->vector_fmul = vector_fmul_c; fdsp->vector_fmac_scalar = vector_fmac_scalar_c; fdsp->vector_fmul_scalar = vector_fmul_scalar_c; + fdsp->vector_dmac_scalar = vector_dmac_scalar_c; fdsp->vector_dmul_scalar = vector_dmul_scalar_c; fdsp->vector_fmul_window = vector_fmul_window_c; fdsp->vector_fmul_add = vector_fmul_add_c; diff --git a/libavutil/float_dsp.h b/libavutil/float_dsp.h index d1be38f..2c24d93 100644 --- a/libavutil/float_dsp.h +++ b/libavutil/float_dsp.h @@ -55,6 +55,22 @@ typedef struct AVFloatDSPContext { int len); /** + * Multiply a vector of doubles by a scalar double and add to + * destination vector. Source and destination vectors must + * overlap exactly or not at all. + * + * @param dst result vector + * constraints: 32-byte aligned + * @param src input vector + * constraints: 32-byte aligned + * @param mul scalar value + * @param len length of vector + * constraints: multiple of 16 + */ + void (*vector_dmac_scalar)(double *dst, const double *src, double mul, + int len); + + /** * Multiply a vector of floats by a scalar float. Source and * destination vectors must overlap exactly or not at all. * -- 2.9.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel