OSDN Git Service

af_amix: use AVFloatDSPContext.vector_fmac_scalar()
authorJustin Ruggles <justin.ruggles@gmail.com>
Sat, 9 Jun 2012 02:34:30 +0000 (22:34 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Mon, 18 Jun 2012 22:01:14 +0000 (18:01 -0400)
libavfilter/af_amix.c

index 003a8e8..4454980 100644 (file)
@@ -32,6 +32,7 @@
 #include "libavutil/audio_fifo.h"
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
+#include "libavutil/float_dsp.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/samplefmt.h"
@@ -152,6 +153,7 @@ static int frame_list_add_frame(FrameList *frame_list, int nb_samples, int64_t p
 
 typedef struct MixContext {
     const AVClass *class;       /**< class for AVOptions */
+    AVFloatDSPContext fdsp;
 
     int nb_inputs;              /**< number of inputs */
     int active_inputs;          /**< number of input currently active */
@@ -263,14 +265,6 @@ static int config_output(AVFilterLink *outlink)
     return 0;
 }
 
-/* TODO: move optimized version from DSPContext to libavutil */
-static void vector_fmac_scalar(float *dst, const float *src, float mul, int len)
-{
-    int i;
-    for (i = 0; i < len; i++)
-        dst[i] += src[i] * mul;
-}
-
 /**
  * Read samples from the input FIFOs, mix, and write to the output link.
  */
@@ -295,9 +289,10 @@ static int output_frame(AVFilterLink *outlink, int nb_samples)
         if (s->input_state[i] == INPUT_ON) {
             av_audio_fifo_read(s->fifos[i], (void **)in_buf->extended_data,
                                nb_samples);
-            vector_fmac_scalar((float *)out_buf->extended_data[0],
-                               (float *) in_buf->extended_data[0],
-                               s->input_scale[i], nb_samples * s->nb_channels);
+            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));
         }
     }
     avfilter_unref_buffer(in_buf);
@@ -500,6 +495,8 @@ static int init(AVFilterContext *ctx, const char *args, void *opaque)
         ff_insert_inpad(ctx, i, &pad);
     }
 
+    avpriv_float_dsp_init(&s->fdsp, 0);
+
     return 0;
 }